【牛客网】CM11 链表分割

题目链接:https://www.nowcoder.com/share/jump/5018980031683455940770

📕题目要求:

现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。


🧠解题思路  

这道题的最优解是创建两个单链表,然后对原链表中的值与X进行比较大小,依次进行合适位置的尾插,最后将较小链表的尾与较大链表的头进行链接,最最重要的是将大链表的next置空。因此不带哨兵位就会出现很多空指针的问题,会加大大家的解题难度,这道题我推荐大家使用带哨兵位的链表。


🍭代码示例

方案一代码示例如下:

ListNode* partition(ListNode* pHead, int x) 
{
    struct ListNode* greaterhead,*greatertail,*lesshead,*lesstail;
    greatertail = greaterhead = (struct ListNode*)malloc(sizeof(struct ListNode));
    lesstail = lesshead = (struct ListNode*)malloc(sizeof(struct ListNode));
    struct ListNode* cur = pHead;
    while(cur!=NULL)
    {
        if(cur->val<x)
        {
            lesstail->next = cur;
            lesstail = lesstail->next;
        }
        else
        {
            greatertail->next = cur;
            greatertail = greatertail->next;   
        }
        cur = cur->next;
    }

    lesstail->next = greaterhead->next;
    greatertail->next = NULL;
    pHead = lesshead->next;
    free(lesshead);
    free(greaterhead);
    return pHead;
}

这就是我对本题的理解,如果大家有更优的解,欢迎交流,一起进步! 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值