zoukankan      html  css  js  c++  java
  • ※剑指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 };
  • 相关阅读:
    为初学者解释下命名空间
    面向对象的思想
    SELECT查询结果集INSERT到数据表
    SQL Server事务
    Sql Server中的谓词和运算符
    SQL查询语句执行的逻辑顺序
    浏览器中的流
    CSS盒子模型
    ArcGIS提取水系并进行生态敏感性分析
    ENVI提取水系并进行生态敏感性分析
  • 原文地址:https://www.cnblogs.com/neverland0718/p/11248982.html
Copyright © 2011-2022 走看看