题目
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
.
在链表中实现partition
代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *partition(ListNode *head, int x) {
ListNode *pos=head,*last_pos=NULL,*end=head,*last_end=NULL,*last_head=head;
//当前处理位置,之前的位置;当前小于值序列的超尾,之前的位置;保留之前的头
head=NULL;
while(pos!=NULL)
{
if(pos->val<x) //元素小于划分值
{
if(pos==end) //之前元素都小于划分值
{
if(last_pos==NULL) //没有确定头的位置
head=pos;
last_pos=pos;
pos=pos->next;
last_end=end;
end=end->next;
}
else if(head==NULL) //之前有大于划分值的元素
{
head=pos;
last_pos->next=pos->next;
pos->next=end;
last_end=pos;
pos=last_pos->next;
}
else //普通情况,将该元素移至小于划分值的序列的微部
{
last_end->next=pos;
last_pos->next=pos->next;
pos->next=end;
last_end=pos;
pos=last_pos->next;
}
}
else //元素大于等于划分值
{
last_pos=pos;
pos=pos->next;
}
}
if(head==NULL) //所有元素都大于划分值
return last_head;
return head;
}
};