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,
Given1->4->3->2->5->2
and x = 3,
题目意思为:给定一个链表和一个数,把这个链表中比这个数小的数全放在比这个数大的数前面,而且两边要保持原来的顺序。
思路有两种。
一是先创建两个新的链表,一个全是比x小的数,一个全是比x大的数。然后合并这两个链表。
第一种方法比较容易理解,具体可以参考:http://blog.csdn.net/havenoidea/article/details/12758079
下面给出第二种方法的代码。
1 struct ListNode { 2 int val; 3 ListNode *next; 4 ListNode(int x) : val(x), next(NULL) {} 5 }; 6 7 //用cur和pre指向大于等于x的第一个节点和上一个节点,为了考虑第一个节点就大于x的情况,增加一个dummy的头结点便于处理方便。 8 class Solution { 9 public: 10 ListNode *partition(ListNode *head, int x) { 11 if(head == NULL){ 12 return head; 13 } 14 ListNode *dummy = new ListNode(0); 15 dummy->next = head; 16 head = dummy; 17 bool hasGreater = false; 18 //找到第一个大于等于x的节点,用cur指向它 19 ListNode *pre = head, *cur = head->next; 20 while(cur!=NULL){ 21 if(cur->val < x){ 22 pre = pre->next; 23 cur = cur->next; 24 } 25 else{ 26 hasGreater = true; 27 break; 28 } 29 } 30 //将cur节点之后所有的小于x的节点都挪到pre的后面,cur的前面。 31 if(hasGreater){ 32 ListNode *pre2 = head, *cur2 = head->next; 33 bool isBehind = false; 34 while(cur2!=NULL){ 35 if(cur2->val == cur->val){ 36 isBehind = true; 37 } 38 if(isBehind && cur2->val < x){ 39 pre2->next = cur2->next; 40 pre->next = cur2; 41 cur2->next = cur; 42 cur2 = pre2->next; 43 pre = pre->next; 44 } 45 else{ 46 pre2 = pre2->next; 47 cur2 = cur2->next; 48 } 49 } 50 } 51 //去掉dummy节点。 52 head = head->next; 53 delete dummy; 54 return head; 55 } 56 };