※剑指offer系列45:删除链表中重复的结点

思路:

1.用两个指针,第一个存之前的结点,第二种存当前结点。

2.每次判断当前结点与当前结点的下一个结点的值是否相同,如果相同就去调用函数寻找下一个与当前结点的值不同的几点,然后将前一个结点与找到的下一个结点连接起来。

                                                                                              如果不同则寻找一个:将当前结点的值付给前结点,当前结点移动到下一个结点。

注意一下几点:

1.对于刚开始的结点有重复值的情况,最开始的前指针pre是空的,无法连到下一个找到的不同的结点。因此这种情况直接将头结点更新即可。

2.链表内的结点全部重复的情况,不必将空指针连接,直接返回空指针。

3.对于两个结点判断是否相等,一定要两个结点都判断是否为空。

 1 class Solution {
 2 public:
 3     ListNode* deleteDuplication(ListNode* pHead)
 4     {
 5         if (pHead == NULL)
 6             return NULL;
 7         //第一个结点是否为相同结点
 8         ListNode* pre = NULL;
 9         ListNode* cur = pHead;//至少有一个结点
10         while (cur!=NULL&&cur->next!= NULL)//至少有两个结点,一定要两个结点都判断
11                                            //我开始写的是while (cur->next!= NULL)牛客超时我还想了很久
12                                            //原因是开始虽然判断了当前结点不为空,可是后面再while里循环的时候当前结点仍然有可能为空
13         {
14             if (cur->val == cur->next->val)
15             {
16                 //寻找下一个不同值的结点
17                 cur = howmanynodes(cur);
18 
19                 if (pre == NULL)
20                 {
21                     pHead = cur;//头结点重复,更新头结点
22                     if (pHead == NULL)//前后都为空,所有结点都重复,返回空
23                         return NULL;
24                 }
25                 else
26                 {
27                     pre->next = cur;//将pre和找到的下一个结点连接起来
28                 }
29             }
30             else//该节点与下个结点的值不同
31             {
32                 pre = cur;
33                 cur = cur->next;
34             }
35 
36         }
37         return pHead;
38     }
39     ListNode* howmanynodes(ListNode* pHead)//参数是一个已知至少有一个相同项的结点,返回下一个不同的结点
40     {
41         int eq = pHead->val;
42         while (pHead != NULL)
43         {
44             if (pHead->val == eq)
45             {
46                 pHead = pHead->next;
47             }
48             else
49                 return pHead;
50         }
51         return NULL;
52 
53     }
54 };

 

posted @ 2019-07-26 11:03  妮妮熊  阅读(111)  评论(0编辑  收藏  举报