1、题目
给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。
2、画图理解
通过上面的分析,其实还有一个问题,当greaterTail指向7时,此时7还是指向原来的next,也就是0,这导致这个链表是个死循环。
解决方案就是让greater的next指向NULL。
3、代码的实现
struct ListNode* partition(struct ListNode* head, int x){
struct ListNode* lessTail ,*lessHead, *greaterTail, *greaterHead;
//创建一个哨兵卫的头节点,然后让尾的next指向NULL
lessHead=lessTail=(struct ListNdoe*)malloc(sizeof(struct ListNode));
lessTail->next=NULL;
greaterHead=greaterTail=(struct ListNdoe*)malloc(sizeof(struct ListNode));
greaterTail->next=NULL;
struct ListNode* cur = head;
//判断cur是否为空,为空循环结束
while(cur)
{
//如果cur的值小于x则放入lessTail的next中,然后把cur给lessTail(这样就能让lessTail指向尾了)
if(cur->val<x)
{
lessTail->next=cur;
lessTail=cur;
}
//否则放入greaterTail的next中,然后把cur给greaterTail(这样就能让greaterTail指向尾了)
else
{
greaterTail->next=cur;
greaterTail=cur;
}
//让cur指向cur的next
cur=cur->next;
}
//把两个指针链接起来
lessTail->next=greaterHead->next;
//让尾指针的next指向空(不指向空会出现死循环)
greaterTail->next=NULL;
//保存lessHead的next的值,然后释放开辟的空间
struct ListNode* newHead = lessHead->next;
free(lessHead);
free(greaterHead);
//最后返回头节点
return newHead;
}
完结~