标签:
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); }
标签:
原文地址:http://blog.csdn.net/uj_mosquito/article/details/42971455