/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
typedef struct ListNode ListNode;
struct ListNode* partition(struct ListNode* head, int x) {
if (head == NULL)
{
return head;
}
//创建两个带头链表
ListNode* lessHead, * lessTail;
ListNode* greaterHead, * greaterTail;
lessHead = lessTail = (ListNode*)malloc(sizeof(ListNode));
greaterHead = greaterTail=(ListNode*)malloc(sizeof(ListNode));
ListNode* pcur = head;
while (pcur)
{
if (pcur->val < x)
{
lessTail->next = pcur;
lessTail = lessTail->next;
}
else
{
greaterTail->next = pcur;
greaterTail = greaterTail->next;
}
pcur = pcur->next;
}
//修改大链表的尾节点的next指针指向
greaterTail->next = NULL;//若不加这一行,代码会出现死循环
//小链表的尾节点和大连表的第一个有效节点首尾相连
lessTail->next = greaterHead->next;
ListNode* ret = lessHead->next;
free(lessHead);
free(greaterHead);
lessHead = greaterHead = NULL;
return ret;
}
//修改大链表的尾节点的next指针指向
greaterTail->next = NULL;//若不加这一行,代码会出现死循环
//小链表的尾节点和大连表的第一个有效节点首尾相连
lessTail->next = greaterHead->next;
这块代码是在修改大链表的next的指针,防止随机值的出现,因而置为NULL;又避免了大链表尾指针原本指向小链表的lesstail导致死循环的问题。