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
.
[Solution]
说明:版权所有,转载请注明出处。 Coder007的博客/**
* 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) {
// Note: The Solution object is instantiated only once and is reused by each test case.
// invalid
if(NULL == head)return NULL;
// the first one that bigger than or equals to x
ListNode* pre1 = head; // the one before p1
ListNode* p1 = head; // the one bigger than or equals to x
while(p1 != NULL && p1->val < x){
pre1 = p1;
p1 = p1->next;
}
// all the elements in the list is small than x
if(p1 == NULL){
return head;
}
// the first one after p1 that smaller than x
ListNode* pre2 = p1; // the one before p2
ListNode* p2 = pre2->next; // the one smaller than x after p1
// swap the elements after p1 and smaller than x to the front of p1
while(p2 != NULL){
while(p2 != NULL && p2->val >= x){
pre2 = p2;
p2 = p2->next;
}
// end of the list
if(p2 == NULL)break;
// swap
// p1 is the head of the list
if(pre1 == p1){
pre2->next = p2->next;
p2->next = p1;
head = p2;
pre1 = p2;
p2 = pre2->next;
}
else{
pre2->next = p2->next;
p2->next = p1;
pre1->next = p2;
pre1 = p2;
p2 = pre2->next;
}
}
return head;
}
};