首页 > 其他 > 详细

【LeetCode练习题】Partition List

时间:2014-04-01 21:05:14      阅读:504      评论:0      收藏:0      [点我收藏+]

 

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,

 

题目意思为:给定一个链表和一个数,把这个链表中比这个数小的数全放在比这个数大的数前面,而且两边要保持原来的顺序。

 

思路有两种。

一是先创建两个新的链表,一个全是比x小的数,一个全是比x大的数。然后合并这两个链表。

 

第一种方法比较容易理解,具体可以参考:http://blog.csdn.net/havenoidea/article/details/12758079

下面给出第二种方法的代码。

 

bubuko.com,布布扣
 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 };
bubuko.com,布布扣

【LeetCode练习题】Partition List,布布扣,bubuko.com

【LeetCode练习题】Partition List

原文:http://www.cnblogs.com/4everlove/p/3639104.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!