【牛客】CM11链表分割

题目分析:

以链表head->4->2->1->6->0->8->7为例,分割后应该为head->4->2->1->0->6->8->7

定义两个链表,less存储比x小的所有节点,greater存储比x大的所有节点

遍历原链表,依次将比x大的所有节点尾插到less链表,比x小的节点尾插到greater链表

最后链接less链表的尾和greater链表的头,并将greater链表得尾节点的next置空,返回less链表的头即可

📖Note:

因为有尾插操作,所以我们定义俩个带哨兵位头节点的链表,方便尾插

特殊情况分析:

1️⃣所有节点的值都小于x

所有节点都小于x,则所有节点都尾插到less链表,greater链表为空

链接两个链表,返回less链表的头即可

注意lessTail->next需要置空

因为我们定义的less链表和greater链表都是带哨兵位的,所以链接两个链表的操作可以实现less->next置空的效果

2️⃣所有节点的值都大于x

所有节点都大于x,则所有节点都尾插到greater链表,less链表为空

链接两个链表,返回less链表的头即可

3️⃣所有节点的值都等于x

我们的less尾插条件是小于x,当所有节点值都等于x时,尾插到greater链表,less链表为空,此时与上述情况二类似,我们的逻辑可以实现

4️⃣空链表:

此时不会进行任何尾插操作,less链表和greater链表都为空

📖Note:

创建两个带哨兵位头的链表后,哨兵位节点的指针域要置空,方便后续的操作

ListNode* partition(ListNode* pHead, int x) 
{
    struct ListNode* lessGuard,*lessTail,*greaterGuard,*greaterTail;
    lessGuard = lessTail = (struct ListNode*)malloc(sizeof(struct ListNode));
    greaterGuard = greaterTail = (struct ListNode*)malloc(sizeof(struct ListNode));
    lessGuard->next = NULL;
    greaterGuard->next = NULL;
    struct ListNode* cur = pHead;

    while (cur)
    {
        //尾插到less链表中
        if (cur->val < x)
        {
            lessTail->next = cur;
            lessTail = lessTail->next;//更新lessTail
        }
        //尾插到greater链表
        else
        {
            greaterTail->next = cur;
            greaterTail = greaterTail->next;
        }
        cur = cur->next;
    }
    //链接两个链表
    lessTail->next = greaterGuard->next;
    greaterTail->next = NULL;
    
    //释放开辟的空间
    pHead = lessGuard->next;
    free(lessGuard);
    free(greaterGuard);

    return pHead;

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值