给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。
你应当保留两个分区中每个节点的初始相对位置。
示例:
输入: head = 1->4->3->2->5->2, x = 3
输出: 1->2->2->4->3->5
解题思路:该题相当于一个分类问题,基于给定参数x分大和小。基于示例解题过程如下:
大领头羊(bigHead)举牌:羊年龄大于等于x跟我走
小领头羊(smallHead)举牌:羊年龄小于x跟我来
x = 3
羊队列:head = 1->4->3->2->5->2
羊群开始找头领....
1 < x smallHead = 1
4 >=x bigHead = 4
3 >=x bigHead = 4->3
2 < x smallHead = 1->2
5 >=x bigHead = 4->3->5
2 < x smallHead = 1->2->2
最后:小领头羊接上大领头羊
smallHead = 1->2->2->4->3->5
代码:
ListNode* partition(ListNode* head, int x)
{
ListNode pBigHead(0);
ListNode pSmallHead(0);
ListNode* pBigCur = &pBigHead;
ListNode* pSmallCur = &pSmallHead;
ListNode*pCur = head;
while (pCur)
{
if (pCur->val >= x)
{
pBigCur->next = pCur;
pBigCur = pBigCur->next;
}
else
{
pSmallCur->next = pCur;
pSmallCur = pSmallCur->next;
}
pCur = pCur->next;
}
pBigCur->next = NULL;
pSmallCur->next = pBigHead.next;
return pSmallHead.next;
}