
题目分析:
以链表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;
}
                
2️⃣所有节点的值都大于x




















