给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。
你应当保留两个分区中每个节点的初始相对位置。
题目理解起来比较拗口,并不是对链表进行完整的排序,可以简单的理解为把小于x的节点拿出来,把大于x的节点拿出来,拼接即可。通过新建两个头节点分别存储大于x和小于x的节点,空间换取时间的理念只需要遍历一遍链表即可完成,思路上比在原链表上进行移动的操作要清晰很多
ListNode* Solution::partition(ListNode* head, int x)
{
ListNode *pless = new ListNode(0);
ListNode *pmore = new ListNode(0);
ListNode *p1 = pless;
ListNode *p2 = pmore;
if((head == NULL)||(head->next == NULL))
{
return head;
}
/*把比x小和比x大的数分别按顺序放入两个新的链表*/
while(head != NULL)
{
if(head->val < x)
{
p1->next = head;
p1 = head;
}
else
{
p2->next = head;
p2 = head;
}
head = head->next;
}
/*拼接两个链表*/
p1->next = pmore->next;
p2->next = NULL;
return pless->next;
}