题目分析:
以链表head->4->2->1->6->0->8->7为例,分割后应该为head->4->2->1->0->6->8->7
定义两个链表,less存储比x小的所有节点,greater存储比x大的所有节点
遍历原链表,依次将比x大的所有节点尾插到less链表,比x小的节点尾插到greater链表
最后链接less链表的尾和greater链表的头,并将greater链表得尾节点的next置空,返回less链表的头即可
📖Note:
因为有尾插操作,所以我们定义俩个带哨兵位头节点的链表,方便尾插
特殊情况分析:
1️⃣所有节点的值都小于x
所有节点都小于x,则所有节点都尾插到less链表,greater链表为空
链接两个链表,返回less链表的头即可
注意lessTail->next需要置空
因为我们定义的less链表和greater链表都是带哨兵位的,所以链接两个链表的操作可以实现less->next置空的效果
2️⃣所有节点的值都大于x
所有节点都大于x,则所有节点都尾插到greater链表,less链表为空
链接两个链表,返回less链表的头即可
3️⃣所有节点的值都等于x
我们的less尾插条件是小于x,当所有节点值都等于x时,尾插到greater链表,less链表为空,此时与上述情况二类似,我们的逻辑可以实现
4️⃣空链表:
此时不会进行任何尾插操作,less链表和greater链表都为空
📖Note:
创建两个带哨兵位头的链表后,哨兵位节点的指针域要置空,方便后续的操作
ListNode* partition(ListNode* pHead, int x)
{
struct ListNode* lessGuard,*lessTail,*greaterGuard,*greaterTail;
lessGuard = lessTail = (struct ListNode*)malloc(sizeof(struct ListNode));
greaterGuard = greaterTail = (struct ListNode*)malloc(sizeof(struct ListNode));
lessGuard->next = NULL;
greaterGuard->next = NULL;
struct ListNode* cur = pHead;
while (cur)
{
//尾插到less链表中
if (cur->val < x)
{
lessTail->next = cur;
lessTail = lessTail->next;//更新lessTail
}
//尾插到greater链表
else
{
greaterTail->next = cur;
greaterTail = greaterTail->next;
}
cur = cur->next;
}
//链接两个链表
lessTail->next = greaterGuard->next;
greaterTail->next = NULL;
//释放开辟的空间
pHead = lessGuard->next;
free(lessGuard);
free(greaterGuard);
return pHead;
}