每日一题---OJ题:分隔链表

片头

嗨!小伙伴们,大家好!今天我们一起来看看这道题----分隔链表

emmmm,这道题,看描述应该不算太难,我们一起来画一画图呗!

题目读懂了,那么如何破解这道题呢?

思路:定义2个链表,大链表和小链表,遍历原链表的节点将其放到对应的新链表中,最后将大链表和小链表首尾相连。

第一次:

第二次:

第三次:

第四次:

第五次:

第六次:

OK,现在pcur在原链表中,已经走到NULL的位置,循环结束,部分代码如下:

复制代码
         typedef struct ListNode ListNode;
        //如果链表为空,返回空
        if(head == NULL){
            return head;
        }

        //pcur遍历原链表
        ListNode* pcur = head;
        //创建小链表,创建小链表的哨兵节点
        ListNode* lessHead = NULL;
        ListNode* lessTail = NULL;
        lessHead = lessTail =(ListNode*) malloc(sizeof(ListNode));

        //创建大链表,创建大链表的哨兵节点
        ListNode* greateHead = NULL;
        ListNode* greateTail = NULL;
        greateHead = greateTail =(ListNode*) malloc(sizeof(ListNode));

        //当pcur遍历到空时,退出循环
        while(pcur!=NULL){
            if(pcur->val < x){
                //尾插到小链表中
                lessTail->next = pcur;
                lessTail = pcur;
            }else{
                //尾插到大链表中
                greateTail->next = pcur;
                greateTail = pcur;
            }
               //pcur指向下一个节点
            pcur = pcur->next;
        }

接下来,我们需要让greateTail的next指针指向NULL,如果不置为NULL的话,就会形成一个环,

下一步,怎么让小链表和大链表连接起来呢?很简单,让lessTail->next = greateHead->next就可以啦!

最后一步,就是用一个节点来保存第一个节点,把2个哨兵节点释放,返回第一个有效节点就可以啦!

复制代码
ListNode* ret = lessHead->next;
free(lessHead);
free(greateHead);
return ret;

OK,这道题被我们解决了,完整代码如下:

复制代码
 typedef struct ListNode ListNode;
struct ListNode* partition(struct ListNode* head, int x) {
        //如果链表为空,返回空
        if(head == NULL){
            return head;
        }

        //pcur遍历原链表
        ListNode* pcur = head;
        //创建小链表,创建小链表的哨兵节点
        ListNode* lessHead = NULL;
        ListNode* lessTail = NULL;
        lessHead = lessTail =(ListNode*) malloc(sizeof(ListNode));

        //创建大链表,创建大链表的哨兵节点
        ListNode* greateHead = NULL;
        ListNode* greateTail = NULL;
        greateHead = greateTail =(ListNode*) malloc(sizeof(ListNode));

        //当pcur遍历到空时,退出循环
        while(pcur!=NULL){
            if(pcur->val < x){
                //尾插到小链表中
                lessTail->next = pcur;
                lessTail = pcur;
            }else{
                //尾插到大链表中
                greateTail->next = pcur;
                greateTail = pcur;
            }
               //pcur指向下一个节点
            pcur = pcur->next;
        }
            //大链表最后一个结点的next指针指向NULL
           greateTail->next = NULL;
           //小链表最后一个节点指向大链表的第一个有效节点
         lessTail->next = greateHead->next;
            
            //用ret来保存小链表的第一个有效节点
        ListNode* ret = lessHead->next;
            //将哨兵节点释放
        free(lessHead);
        free(greateHead);
            //将ret返回
        return ret;
}

片尾

今天我们学习了一道OJ题---分隔链表,希望看完这篇文章能对友友们有所帮助!!!

点赞收藏和关注!!!

谢谢大家!!!

相关推荐
月落归舟1 小时前
排序算法---(一)
数据结构·算法·排序算法
今儿敲了吗1 小时前
DS-3 循环队列判断队满
数据结构·笔记·学习
liuyao_xianhui1 小时前
优选算法_翻转链表_头插法_C++
开发语言·数据结构·c++·算法·leetcode·链表·动态规划
Book思议-1 小时前
【数据结构实战】循环队列FIFO 特性生成六十甲子(天干地支纪年法),实现传统文化里的 “时间轮回”
数据结构·算法·
cpp_25012 小时前
P1796 汤姆斯的天堂梦
数据结构·c++·算法·题解·洛谷·线性dp
凌波粒2 小时前
LeetCode--19.删除链表的倒数第 N 个结点(链表)
java·算法·leetcode·链表
Mem0rin2 小时前
[Java/数据结构]顺序表之ArrayList
java·开发语言·数据结构
ShineWinsu2 小时前
Anaconda被误删后的抢救手册大纲
数据结构
重生之我是Java开发战士2 小时前
【广度优先搜索】多源BFS:矩阵,飞地的数量,地图中的最高点,地图分析
数据结构·算法·矩阵·广度优先
玛卡巴卡ldf3 小时前
【LeetCode 手撕算法】(矩阵)73-矩阵置零、54-螺旋矩阵(贪吃蛇)、48-旋转图像
java·数据结构·算法·leetcode·力扣