题解 | #链表分割#

链表分割

https://www.nowcoder.com/practice/0e27e0b064de4eacac178676ef9c9d70

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};*/
//在c++中我们不需要重新定义名字,我们直接用ListNode

/*
思路:我么还能创建一个大链表,一个小链表
将遍历原先的链表,将比x小的节点放到小链表里面
将比x大的节点放到大链表里面
然后我们再进行大小链表的对接
3我们将小链表的尾链表的下一个节点变成大链表头结点的下一个节点
因为我们在创建的大小链表的时候,用的是malloc开辟的节点,因此大小链表的头结点就相当一个站位置的
并不是一个有效的节点
*/
class Partition {
public:
    ListNode* partition(ListNode* pHead, int x)//返回链表的头节点
    {
        //创建两个非空链表
        ListNode*lessHead,*lessTail; 
        //小链表
        lessHead=lessTail=(ListNode*)malloc(sizeof(ListNode));//开辟一个节点大小的空间
        //大链表
        ListNode*greaterHead,*greaterTail;
        greaterHead=greaterTail=(ListNode*)malloc(sizeof(ListNode));

        //创建一个临时指针遍历链表,找小于x的和其他节点位插到大小链表中
        ListNode*pcur=pHead;//初始化指向头节点
        while(pcur)//等价与pcur!=NULL
        {
            if(pcur->val<x)//尾插到小链表
            {
                //因为我们的大小链表都是非空的,那么我们直接往头节点后面进行尾插
                lessTail->next=pcur;
                lessTail=lessTail->next;//尾节点走到新的位置
            }
            else //尾插到大链表
            {
                greaterTail->next=pcur;
                greaterTail=greaterTail->next;
            }
            pcur=pcur->next;//pcur换下个节点进行比较
            
        }
        //跳出循环,说明此时我们的原链表已经遍历完了
        //我们现在要让大链表和小链表进行首尾相连
        lessTail->next=greaterHead->next;
        greaterTail->next=NULL;
        //此时我们要将lessHead和greatHead进行释放
        //但是我们题目要求是将新的链表的头结点进行返回,
        //但是如果我们先将lessHead进行释放的话,那么我们是无法找到头节点的
        //所以我们在释放操作之前我们需要将头结点进行比保存
        //定义一个指针指向小节点第一个有效的节点
        ListNode*ret=lessHead->next;
        free(lessHead);
        lessHead=NULL;
        free(greaterHead);
        greaterHead=NULL;


        //返回头节点
        return ret;
    }
};/*
对于这个题来说的话
假设我们原先的链表是5->1->3->6->2
经过一系列操作后我们得到了大小两个链表
小链表:头结点->1->2
大链表:头节点—>5-3->6

再次进行操作得到了
1->2—>5-3->6  
但是我们有没有想过这个题目会出现死循环呢?
因为在之前我们没有对6的下个节点进行操作,如果不进行操作的话
那么这个链表的指向就是这样的:1->2—>5-3->6->2—>5-3->6->2—>5-3->6 .......
所以我们需要将6的下个节点指向NULL




*/

全部评论

相关推荐

09-01 11:31
门头沟学院 Java
buul:七牛云的吧,感觉想法是好的,但是大家没那么多时间弄他这个啊。。。不知道的还以为他是顶尖大厂呢还搞比赛抢hc,只能说应试者的痛苦考察方是无法理解的,他们只会想一出是一出
点赞 评论 收藏
分享
10-23 16:33
门头沟学院 Java
本人某中9本科,成绩中等,目前没科研没实习,目前后端学到了javaWeb,开始没定好方向,在学国外课程,走工程路线起步有点晚了,到这个时间点了还在学JavaWeb,顿感迷茫,不知道是坚持走下去还是寒假去准备考研。考研这个路弄得我还是心痒痒的,因为从众考研的人也不在少数,所以会有这方面的心理安慰吧,就是“不行我可以去考研啊”,而且意味着三年的缓冲,为了复试还有积攒经验美化简历,其实现在也可以去申入实验室打杂;就业可能意味着多些工作经验,工程岗应该到后面还是经验大于学历?还是有点迷茫了,求助好心人有无路线启发
千千倩倩:同27给点建议,现在这个时间点可以快速看完外卖和点评,不用跟着敲,但一定要在看的时候总结每个部分的整个业务流程,对其中的实现有一个大概的印象。然后直接开始看八股,刷算法。八股和算法最好还是在项目学习中穿插着看。如果计算机基础,算法这些基础好,加上每天刻苦学习,两周可以达到勉强能面试的水平,到时候就直接海投中小厂,在约面和面试的过程中不断巩固知识。没找到实习也没关系,就当积累经验。再沉淀一波直接明年三月开始投暑期,毕竟是9本,总是有面试机会的,只要你这三个月不懈怠,面试发挥得一定不错,只要拿到一个中,大厂暑期实习,秋招就有竞争力了。总得而言,现在还有机会,但是时间非常紧张,需要你结合自己情况考虑,共勉
你会选择考研还是直接就业
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务