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;
* struct ListNode *next;
* };
*/
struct ListNode* partition(struct ListNode* head, int x) {
struct ListNode *partition = NULL;
struct ListNode *index= head;
struct ListNode *preindex = NULL;
while(index != NULL) {
if (index->val < x) { // 找到 < x 的元素
if (preindex == NULL) { // 表示 head 是第一个 < x 的元素
partition = head;
} else if (partition == NULL) { // 表示head 不是第一个 < x的元素
preindex->next = index->next;
index->next = head;
head = index;
partition = index;
index = preindex->next;
continue;
} else if (partition == preindex) { // 表示 partition 就是 preindex
partition = index;
} else { // 最普遍的情况
preindex->next = index->next;
index->next = partition->next;
partition->next = index;
partition = index;
index = preindex->next;
continue;
}
}
preindex = index;
index = index->next;
}
return head;
}
题目思想:
别人的思想:
创建一个开始的节点,就是我们上面partition有指向,然后往后面添加小于x的元素,最后将原来主链表中剩下的大于x的插入到已新创建的链表尾端:
struct ListNode* partition(struct ListNode* head, int x) {
struct ListNode*head1=(struct ListNode*)malloc(sizeof(struct ListNode));
struct ListNode*head2=(struct ListNode*)malloc(sizeof(struct ListNode));
struct ListNode*left=head1;
struct ListNode*right=head2;
while(head!=NULL){
if(head->val<x){
head1->next=head;
head1=head;
}
else{
head2->next=head;
head2=head;
}
head=head->next;
}
head2->next=NULL;//delete will be wrong important avoid cycle
head1->next=right->next;
return left->next;
}