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

牛客网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的部分)的首结点即可。

完整代码

/**
 * 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))。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

对编程一片赤诚的小吴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值