前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C语言每日一题(30)分割链表

C语言每日一题(30)分割链表

作者头像
对编程一片赤诚的小吴
发布2024-01-23 15:08:27
930
发布2024-01-23 15:08:27
举报

牛客网NC23 划分链表

题目描述

给出一个长度为 n 的单链表和一个值 x ,单链表的每一个值为 list,请返回一个链表的头结点,要求新链表中小于 x 的节点全部在大于等于 x 的节点左侧,并且两个部分之内的节点之间与原来的链表要保持相对顺序不变。

例如:

给出 1→4→3→2→5→2 和 x=3

返回 1→2→2→4→3→5

思路分析

将该链表小于x的部分和大于等于x的部分进行拆分分别用两个头结点指向,相当于分别存入两个链表里,最后将链表1(小于x的部分)的尾结点指向链表2(大于等于x的部分)的首结点即可。

完整代码

代码语言:javascript
复制
/**
 * struct ListNode {
 *  int val;
 *  struct ListNode *next;
 * };
 */
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 *
 * @param head ListNode类
 * @param x int整型
 * @return ListNode类
 */
struct ListNode* partition(struct ListNode* head, int x ) {
    struct ListNode* head1, *head2, *tail1, *tail2;
    head1 = tail1 = (struct ListNode*)malloc(sizeof(struct ListNode));//两个哨兵位
    head2 = tail2 = (struct ListNode*)malloc(sizeof(struct ListNode));
    struct ListNode* cur = head;
    if (head == NULL) {//链表为空的情况直接返回头结点即可
        return head;
    } else {
        while (cur) {
            if (cur->val < x) {//小于x的值放到链表1里
                tail1->next = cur;
                tail1 = tail1->next;

            } else {//大于等于x的值放到链表2里
                tail2->next = cur;
                tail2 = tail2->next;
            }
            cur = cur->next;//遍历原数组
        }
        tail1->next = head2->next;//链表1的末尾指向链表2的头

        tail2->next = NULL;//注意置空

        head = head1->next;
        free(head1);//记得释放哨兵位
        free(head2);
        return head;
    }
}

实现细节

采用两个哨兵位创建两个链表,避免头结点为空的情况(本人正在努力实现不带哨兵位的情况(doge))。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-01-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目描述
  • 思路分析
  • 完整代码
  • 实现细节
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档