86 Partition List
链接:https://leetcode.com/problems/partition-list/
问题描述:
Given a linked list and a value x, partition it such that all nodes less than x come before nodes greater than or equal to x.
You should preserve the original relative order of the nodes in each of the two partitions.
For example,
Given 1->4->3->2->5->2 and x = 3,
return 1->2->2->4->3->5.
Hide Tags Linked List Two Pointers
这个问题是把链表中值小于x的节点移动到前面。这里需要注意的是首先需要找到一个中间节点,需要移动的节点要移到这个中间节点的前面。可以先找到第一个值大于等于x的节点,这个节点就是中间节点。假设中间节点的前一个节点为*p,需要移动的节点是*node,
node->next=p->next;
p->next=node;
p=node;
这样就完成了移动。
class Solution {
public:
ListNode* partition(ListNode* head, int x) {
if(head==NULL||head->next==NULL) return head;
ListNode *t=new ListNode(INT_MIN);
t->next=head;
ListNode *pre=t,*p=t;
while(p->next&&p->next->val<x)
p=p->next;
if(p->next==NULL) {delete t;return head;}
head=p->next;
while(head!=NULL)
{
if(head->val<x)
{
pre->next=head->next;
head->next=p->next;
p->next=head;
p=head;
head=pre->next;
}
else
{
pre=head;
head=head->next;
}
}
head=t->next;
delete t;
return head;
}
};