片头
嗨!小伙伴们,大家好!今天我们一起来看看这道题----分隔链表
![](https://img-blog.csdnimg.cn/direct/3d010d00c6e34be8b07ca9c5e2e482ef.png)
emmmm,这道题,看描述应该不算太难,我们一起来画一画图呗!
![](https://img-blog.csdnimg.cn/direct/9bede8e3c1d54d43a2e45732865397bd.png)
题目读懂了,那么如何破解这道题呢?
思路:定义2个链表,大链表和小链表,遍历原链表的节点将其放到对应的新链表中,最后将大链表和小链表首尾相连。
![](https://img-blog.csdnimg.cn/direct/d0e785b551914cb3bf42ce4e5beb8d8f.png)
第一次:
![](https://img-blog.csdnimg.cn/direct/d4b1f18e88174924939933580e612434.png)
第二次:
![](https://img-blog.csdnimg.cn/direct/5299749be5ae4479a2033416cdf1e9c7.png)
第三次:
![](https://img-blog.csdnimg.cn/direct/059f913520b04f9f9dd4e6003379dd4f.png)
第四次:
![](https://img-blog.csdnimg.cn/direct/834c5b5338b74d35b788ca8db1ca52bc.png)
第五次:
![](https://img-blog.csdnimg.cn/direct/c9c6e1ca11834113bbdd793ae1c1a6ba.png)
第六次:
![](https://img-blog.csdnimg.cn/direct/3f3c3d9c43934c5cb26809140b5fddbb.png)
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的话,就会形成一个环,
![](https://img-blog.csdnimg.cn/direct/36a8c1bb1aa3460cadf57c0cabd9d06d.png)
下一步,怎么让小链表和大链表连接起来呢?很简单,让lessTail->next = greateHead->next就可以啦!
![](https://img-blog.csdnimg.cn/direct/8566c0f69a1849e4a2826e229755328c.png)
最后一步,就是用一个节点来保存第一个节点,把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题---分隔链表,希望看完这篇文章能对友友们有所帮助!!!
求点赞收藏和关注!!!
谢谢大家!!!
![](https://img-blog.csdnimg.cn/direct/4ab40e05c5854135b98eb5477bbba6fe.png)