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
.
首先建立两个链表small和large,small中存储比x大或者相等的数据,large中存储比x小的数据。用指针a和b分别对small和large进行操作。对head处理完后,a指针指向small中最后的一个数据。由于这里的small和large的第一个元素都是哑元素,所以串起来和返回都要加上一个next。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* partition(struct ListNode* head, int x) {
if(head==NULL) return 0;
struct ListNode* small;
small=malloc(sizeof(struct ListNode));
struct ListNode* large;
large=malloc(sizeof(struct ListNode));
struct ListNode* a=small;
struct ListNode* b=large;
while(head!=NULL){
if(head->val<x) {
a->next=head;
a=a->next;
}
else {
b->next=head;
b=b->next;
}
head=head->next;
}
a->next=large->next;
return small->next;
}