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
.
题目解析:
方法类似快速排序。不过这类要设置两个指针,一个指向小于x结点的链表指针small,一个指向大于等于x的链表指针big。在设置两个指针psmall和pbig分别指向上述链表的尾结点。
有个需要注意的地方,遍历完整个链表后,pbig->next可能不为空,如果直接让psmall = big,可能造成环。所以每次区分完一个结点后,都将pbig->next = NULL; 由于要这样,head = head->next就必须在其之前赋值,否则会造成链表断裂。
class Solution {
public:
ListNode *partition(ListNode *head, int x) {
if(head == NULL || head->next == NULL)
return head;
ListNode *small=NULL,*big=NULL;
ListNode *psmall,*pbig;
int count = 0;
while(head){
if(head->val < x){
if(small == NULL){
small = head;
psmall = small;
}else{
psmall->next = head;
psmall = head;
}
head = head->next;
}else{
if(big == NULL){
big = head;
pbig = big;
head = head->next;
}else{
pbig->next = head;
pbig = head;
head = head->next;
}
pbig->next = NULL;
}
}
if(small == NULL){
return big;
}
psmall->next = big;
return small;
}
};