思路
创建两条链表,分别存放比x小和大于等于x的数值,然后把较大数值的链表连接在小链表前。
注意点
- 有两种构建初始链表的选择:本文选择带头结点的,如果不带头结点,则需要对空链表进行判断,当是空链表的时候,对头指针进行赋值。
- 避免死循环 cur 每次向后移动
greaterTail->next = NULL;
因为尾结点指向没有改变,链表会在内部成环,死循环。如以下情况:
最后的5被“分配”到了大链表的时候,其实还是指向2的,所以会在链表内部形成一个环。
代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* partition(struct ListNode* head, int x){
struct ListNode* lessHead, *lessTail, *greaterHead, *greaterTail;
// 带头结点
lessHead = lessTail = (struct ListNode*)malloc(sizeof(struct ListNode));
greaterHead = greaterTail = (struct ListNode*)malloc(sizeof(struct ListNode));
lessTail->next = NULL;
greaterHead->next = NULL;
struct ListNode* cur = head;
while(cur)
{
if(cur->val < x)
{
lessTail->next = cur;
lessTail = cur;
}
else
{
// >=
greaterTail->next = cur;
greaterTail = cur;
}
cur = cur->next;
}
// 因为cur指向没有改变,链表会在内部成环
greaterTail->next = NULL;
lessTail->next = greaterHead->next;
struct ListNode* newhead = lessHead->next;
free(lessHead);
free(greaterHead);
return newhead;
}