码迷,mamicode.com
首页 > 其他好文 > 详细

leetcode - Remove Duplicates from Sorted List

时间:2014-07-10 14:29:45      阅读:259      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   os   art   

题目:Remove Duplicates from Sorted List

Given a sorted linked list, delete all duplicates such that each element appear only once.

For example,
Given 1->1->2, return 1->2.
Given 1->1->2->3->3, return 1->2->3.

 

个人思路:

1、删除链表的重复节点,先遍历一遍链表,统计不相同节点值的出现次数,这里借助map来统计

2、然后再遍历一遍链表,出现次数大于1的节点需要删掉,并且更新一下出现次数

3、注意一下头节点的删除和中间节点的删除就行了

代码:

bubuko.com,布布扣
 1 #include <stddef.h>
 2 #include <map>
 3 
 4 using namespace std;
 5 
 6 struct ListNode
 7 {
 8     int val;
 9     ListNode *next;
10     ListNode(int x) : val(x), next(NULL) {};
11 };
12 
13 class Solution
14 {
15 public:
16     ListNode *deleteDuplicates(ListNode *head)
17     {
18         map<int, int> total_count;
19 
20         //统计不相同节点值的出现次数
21         for (ListNode *cur = head; cur != NULL; cur = cur->next)
22         {
23             map<int, int>::iterator it = total_count.find(cur->val);
24             if (it != total_count.end())
25             {
26                 total_count[cur->val] = it->second + 1;
27             }
28             else
29             {
30                 total_count[cur->val] = 1;
31             }
32         }
33 
34         //删除重复节点
35         for (ListNode *cur = head, *pre = head; cur != NULL; )
36         {
37             map<int, int>::iterator it = total_count.find(cur->val);
38 
39             //表明该节点重复
40             if (it->second > 1)
41             {
42                 total_count[cur->val] = it->second - 1;
43 
44                 //删除头节点
45                 if (cur == head)
46                 {
47                     head = head->next;
48                     delete cur;
49                     cur = pre = head;
50                 }
51                 //删除中间节点
52                 else
53                 {
54                     pre->next = cur->next;
55                     delete cur;
56                     cur = pre->next;
57                 }
58             }
59             //节点不重复
60             else
61             {
62                 if (cur != head)
63                 {
64                     pre = pre->next;
65                 }
66 
67                 cur = cur->next;
68             }
69         }
70 
71         return head;
72     }
73 };
74 
75 int main()
76 {
77     return 0;
78 }
View Code

 

突然发现漏掉一个重要条件,链表已经排好序了,那么只需要判断当前节点与下一个节点是否相同就行了,如果相同则删除下一个节点,并且将当前节点和下下个节点连起来,如果不同就让当前节点指向下一个节点,哎,真是太傻比了。。。

代码:

bubuko.com,布布扣
  1 #include <stddef.h>
  2 #include <map>
  3 
  4 using namespace std;
  5 /*
  6 struct ListNode
  7 {
  8     int val;
  9     ListNode *next;
 10     ListNode(int x) : val(x), next(NULL) {};
 11 };
 12 */
 13 class Solution
 14 {
 15 public:
 16     ListNode *deleteDuplicates(ListNode *head)
 17     {
 18         /*
 19         map<int, int> total_count;
 20 
 21         //统计不相同节点值的出现次数
 22         for (ListNode *cur = head; cur != NULL; cur = cur->next)
 23         {
 24             map<int, int>::iterator it = total_count.find(cur->val);
 25             if (it != total_count.end())
 26             {
 27                 total_count[cur->val] = it->second + 1;
 28             }
 29             else
 30             {
 31                 total_count[cur->val] = 1;
 32             }
 33         }
 34 
 35         //删除重复节点
 36         for (ListNode *cur = head, *pre = head; cur != NULL; )
 37         {
 38             map<int, int>::iterator it = total_count.find(cur->val);
 39 
 40             //表明该节点重复
 41             if (it->second > 1)
 42             {
 43                 total_count[cur->val] = it->second - 1;
 44 
 45                 //删除头节点
 46                 if (cur == head)
 47                 {
 48                     head = head->next;
 49                     delete cur;
 50                     cur = pre = head;
 51                 }
 52                 //删除中间节点
 53                 else
 54                 {
 55                     pre->next = cur->next;
 56                     delete cur;
 57                     cur = pre->next;
 58                 }
 59             }
 60             //节点不重复
 61             else
 62             {
 63                 if (cur != head)
 64                 {
 65                     pre = pre->next;
 66                 }
 67 
 68                 cur = cur->next;
 69             }
 70         }
 71 
 72         return head;
 73         */
 74 
 75         if (!head)
 76         {
 77             return NULL;
 78         }
 79 
 80         ListNode *cur = head;
 81         ListNode *next = NULL;
 82 
 83         while (cur->next)
 84         {
 85             next = cur->next;
 86             if (cur->val == next->val)
 87             {
 88                 cur->next = next->next;
 89                 delete next;
 90             }
 91             else
 92             {
 93                 cur = cur->next;
 94             }
 95         }
 96 
 97         return head;
 98     }
 99 };
100 /*
101 int main()
102 {
103     return 0;
104 }
105 */
View Code

 

leetcode - Remove Duplicates from Sorted List,布布扣,bubuko.com

leetcode - Remove Duplicates from Sorted List

标签:style   blog   http   color   os   art   

原文地址:http://www.cnblogs.com/laihaiteng/p/3811577.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!