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
.
/**
* 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) {
if( head == NULL || head -> next == NULL ) return head;<span style="white-space:pre"> </span>// case 1:链表为空或者只有一个元素,则直接返回
ListNode *p = NULL,*q = head;
ListNode *begin = NULL,*end = NULL,*inbegin = NULL,*inend = NULL;// begin,end 为第一个大于等于x的切割位点
while( q != NULL ) {<span style="white-space:pre"> </span>// inbegin,inend 为切割点之后所有小于x的元素的
if( q -> val >= x ) {<span style="white-space:pre"> </span>// 首尾元素
begin = p;
end = q;
break;
}
p = q;
q = q -> next;
}
if( q == NULL || q -> next == NULL ) return head;<span style="white-space:pre"> </span>//case 2:不存在切割点或者切割点为最后一个元素,则无需改动
int flag = 1;
while( q != NULL ) {
if( q -> val < x ) {
p -> next = q -> next;
if( flag ) {<span style="white-space:pre"> </span>// inbegin,inend 的赋值
inbegin = q;
inend = q;
flag = 0;
q = q -> next;
continue;
}
inend -> next = q;
inend = inend -> next;
q = q -> next;
}
else {
p = q;
q = q -> next;
}
}
if( inbegin == NULL ) return head;<span style="white-space:pre"> </span>//case 3:切割点后不存在小于x的点,直接返回
<span style="white-space:pre"> </span>else if( begin == NULL ) {<span style="white-space:pre"> </span>//case 4:切割点在head位置,则在head之前插入inbegin至inend的元素,
inend -> next = end;<span style="white-space:pre"> </span>//返回inbegin
return inbegin;
}
else {<span style="white-space:pre"> </span>//case 5:切割点不在首部,且之后存在小于x的元素,则将inbegin至inend
begin -> next = inbegin;<span style="white-space:pre"> </span>//之间的元素插入切割点,返回head
inend -> next = end;
return head;
}
}
};