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
.
#include<stdio.h>
#include<stdlib.h>
typedef struct ListNode {
int val;
struct ListNode *next;
}ListNode;
ListNode *partition(ListNode *head, int x) {
ListNode *less = NULL, *bigger = NULL, *p;
ListNode *less_index , *bigger_index;
int less_cnt = 0, bigger_cnt = 0;
if(head == NULL) return NULL;
for(p = head; p != NULL; p = p->next) {
if(p->val < x) {
if(less_cnt == 0) less_index = less = p;
else {
less_index->next = p;
less_index = p;
}
less_cnt++;
}
else {
if(bigger_cnt == 0) bigger_index = bigger = p;
else {
bigger_index->next = p;
bigger_index = p;
}
bigger_cnt++;
}
}
if(less != NULL) less_index->next = bigger;
else less = bigger;
if(bigger != NULL) bigger_index->next = NULL;
return less;
}
void main() {
ListNode *head, *p1, *p2;
int i = 0;
p1 = p2 = (ListNode *)malloc(sizeof(ListNode));
scanf("%d", &p1->val);
while(p1->val != -1) {
i++;
if(i == 1) head = p1;
else p2->next = p1;
p2 = p1;
p1 = (ListNode *)malloc(sizeof(ListNode));
scanf("%d", &p1->val);
}
p2->next = NULL;
for(p1 = head; p1 != NULL; p1 = p1->next) printf("%d ", p1->val);
printf("\n");
partition(head, 0);
}