【算法专题--链表】删除排序链表中的重复元素II -- 高频面试题(图文详解,小白一看就懂!!)

目录

一、前言

二、题目描述 

三、解题方法

⭐ 双指针 -- 采用 哨兵位头节点

🥝 什么是哨兵位头节点? 

🍍 解题思路 

🍍 案例图解 

四、总结与提炼

五、共勉 


一、前言

     删除排序链表中的重复元素II元素这道题,可以说是--链表专题--,最经典的一道题,也是在面试中频率最高的一道题目,通常在面试中,面试官可能会从多个方面考察这道题目,所以大家需要对这道题目非常熟悉哦!!
      本片博客就来详细的讲讲解一下
删除排序链表中的重复元素II 的实现方法,让我们的面试变的更加顺利!!!

二、题目描述 

给定一个已排序的链表的头 head  删除原始链表中所有重复数字的节点只留下不同的数字 。返回 已排序的链表 

 三、解题方法

⭐ 双指针 -- 采用 哨兵位头节点

🥝 什么是哨兵位头节点? 

 首先,先来了解一下什么是  哨兵位---头节点 ? 

  • 它是一个附加的链表结点,该 结点 作为 第一个节点它的数据域不存储任何东西,只是为了操作的方便而引入的。
  • 也就是说,如果一个链表有哨兵节点的话,那么链表表的第一个元素应该是链表的第二个节点。

 哨兵位 --- 头节点的作用:  

  • 比如向链表中插入一个节点,对于没有哨兵位单链表当待插入的节点为链表的第一个节点,由于没有前驱,需要进行特殊处理,从而代码的复杂性增加。 
  • 如果有哨兵位头节点,则第一个节点的处理方式与其它节点相同,可以统一进行处理

🍍 解题思路 

这道题,其实就是之前讲过的 ---- 删除排序链表中的重复元素 --- 的升级版 

  • 我们先创建一个 哨兵位的头节点 pre_head , 令 pre_head->next = head ,  然后创建 双指针 pre 指向 pre_head ,指针 cur 指向 head , 开始遍历整个链表

  • cur 指向的节点值 与 cur->next 指向的节点值相同时,我们就让 cur 不断向后移动,直到 cur 指向的节点值与 cur->next 指向的节点值不相同时,停止移动。
  • 此时,我们判断 pre->next 是否等于 cur ,如果相等,说明 precur 之间没有重复节点(因为 cur 没有因为有重复节点而向后移动);否则,说明 precur 之间重复的节点,我们就让  pre->next 指向 cur ->next  (跳过重复的元素,重新建立连接)
  •  然后让 cur 继续向后移动,继续上述操作,直到 cur 为空,遍历结束

 🍍 案例图解 

 链表:【1,2,3,3,4,4,5】

  •  创建 哨兵位头节点 和 双指针,开始遍历整个链表

  •  cur 与下一个节点 值不同,pre ->next = cur , cur 与 pre之间没有重复元素,pre向前移动

  •  cur 与下一个节点 值相同,cur 向后移动

  •  pre ->next != cur 存在重复元素,跳过重复元素,重新建立连接

  •   cur 与下一个节点 值相同,cur 向后移动

  •   pre ->next != cur 存在重复元素,跳过重复元素,重新建立连接

  •  然后让 cur 继续向后移动,继续上述操作,直到 cur 为空,遍历结束
  • 返回 pre_head ->head

 代码:

class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head) 
    {
        // 创建一个 哨兵位的 头节点 初始化为 -1 ,并且 连接在 head 之前
        ListNode* pre_head = new ListNode(-1,head);

        // 双指针
        ListNode* pre = pre_head;
        ListNode* cur = head;
        // 开始遍历整个链表
        while(cur)
        {
            // 寻找 下一个不同值的 节点
            while(cur->next && cur->next->val == cur->val)
            {
                cur = cur->next;
            }

            // 由于cur 遇到重复 会向后移动 所以 当 pre->next!=cur时,说明有重复元素
            // pre 与 cur 之间没有重复的元素
            if(pre->next == cur)
            {
                //没有重复元素时 pre 就向后移动
                pre = cur;
            }
            else  // 存在重复的元素
            {
                // 跳过重复的元素,重建建立连接
                pre->next = cur->next;
            }

            // 更新当前节点
            cur = cur->next;
        }
        // 返回哨兵位 后的头节点
        return pre_head->next;
    }
};

四、总结与提炼

        最后我们来总结一下本文所介绍的内容,本文讲解来一道力扣中有关删除排序链表中的重复元素II的题目,这道题目是校招笔试面试中有关链表章节非常高频的一道题目大家下去一定要自己再画画图,分析一下,把这段代码逻辑自己实现一遍,才能更好地掌握 

五、共勉 

         以下就是我对 删除排序链表中的重复元素II 的理解,如果有不懂和发现问题的小伙伴,请在评论区说出来哦,同时我还会继续更新对 链表专题 的理解,请持续关注我哦!!! 

最近更新

  1. TCP协议是安全的吗?

    2024-06-17 01:28:05       14 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-17 01:28:05       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-17 01:28:05       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-17 01:28:05       18 阅读

热门阅读

  1. 微信小程序地图

    2024-06-17 01:28:05       6 阅读
  2. 从softmax分类问题看神经网络的核心

    2024-06-17 01:28:05       7 阅读
  3. 搜索引擎Lucene(Solr和Elasticsearch)2

    2024-06-17 01:28:05       8 阅读
  4. Python:哈希查找法

    2024-06-17 01:28:05       7 阅读
  5. 简单剖析tRPC-Go中使用的第三方协程池ants

    2024-06-17 01:28:05       8 阅读
  6. Opencv无法自动补全

    2024-06-17 01:28:05       6 阅读
  7. 15分钟面试被5连CALL,你扛得住么?

    2024-06-17 01:28:05       7 阅读
  8. SSH error : no kex alg message

    2024-06-17 01:28:05       7 阅读
  9. Spring (60)Spring WebFlux

    2024-06-17 01:28:05       8 阅读
  10. 数据结构之B树的原理与业务场景

    2024-06-17 01:28:05       7 阅读
  11. Autosar实践——诊断配置(DaVinci Configuration)

    2024-06-17 01:28:05       6 阅读