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

news2024/12/29 10:56:33

目录

一、前言

二、题目描述 

三、解题方法

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

🥝 什么是哨兵位头节点? 

🍍 解题思路 

🍍 案例图解 

四、总结与提炼

五、共勉 


一、前言

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1829498.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL之优化服务器设置(五)

优化服务器设置 高级InnoDB设置 innodb_old_blocks_time InnoDB有两段缓冲池LRU(最近最少使用)链表,设计目的是防止换出长期很多次的页面。像mysqldump产生的这种一次性的(大)查询,通常会读取页面到缓冲池的LRU列表,从中读取需要的行&…

ubuntu中安装docker并换源

使用 Ubuntu 的仓库安装 Docker sudo apt update现在,你可以使用以下命令在 Ubuntu 中安装 Docker 以及 Docker Compose: sudo apt install docker.io docker-composeDocker 包被命名为 docker.io,因为在 Docker 出现之前就已经存在一个名为…

C++ virtual public(虚继承类)

这个"virtual"有什么作用? 由于C支持多重继承,所以对于一个派生类中有几个直接父类,而几个直接父类中有几个可能分别继承自某一个基类(就是父类的父类),这样在构造最终派生类时,会出现…

Nginx + Tomcat 负载均衡、动静分离

前言 Tomcat简介 最初是由Sun的软件构架师詹姆斯邓肯戴维森开发 安装Tomcat后,安装路径下面的目录和文件,是使用或者配置Tomcat的重要文件 Nginx 应用 Nginx是一款非常优秀的HTTP服务器软件 (1)支持高达50 000个并发连接数的响应…

单目标应用:基于三角拓扑聚合优化算法TTAO的微电网优化(MATLAB代码)

一、微电网模型介绍 微电网多目标优化调度模型简介_vmgpqv-CSDN博客 参考文献: [1]李兴莘,张靖,何宇,等.基于改进粒子群算法的微电网多目标优化调度[J].电力科学与工程, 2021, 37(3):7 二、三角拓扑聚合优化算法求解微电网 2.1算法简介 三角拓扑聚合优化算法&…

毕业了校园卡怎么改套餐?

毕业了校园卡怎么改套餐? 毕业生校园卡99元套餐变更8元保号套餐教程 学弟学妹们恭喜毕业呀🎓 校园卡绑定了好多东西注销不掉又不想交高额月租的看过来。 今天一招教你更改校园卡套餐。 中国移动/电信/联通App 打开App,在首页右上角点击人工…

LVS负载均衡集群企业级应用实战-LVS-DR(四)

目录 LVS-DR 一. 环境准备 二. 对虚拟主机操作 三. 对真实服务器操作 四. 打开网页测试 LVS-DR 一. 环境准备 三台虚拟机,都要在同一网段内,统一关闭防火墙和selinux,时间同步,配置好YUM源。系统用centos和roucky都行。 主…

【Netty】ByteBuffer原理与使用

Buffer则用来缓冲读写数据,常见的buffer有: ByteBuffer MappedByBuffer DirectByteBuffer HeapByteBuffer hortBuffer IntBuffer LongBuffer FloatBuffer DoubleBuffer CharBuffer 有一个普通文本文件data.txt,内容为: 1234567890a…

CSS实现前端小组件随笔

一.CSSJS实现打字机效果 1.1实现效果 1.2HTML部分 <span class"bottom-text"></span> 1.3CSS部分 .bottom-text {font-fanmily: "fangsong";display:inline-block;position:relative;font-size:20px;height:20px;inline-height:20px;color…

【Qt项目专栏】贪吃蛇小游戏1.0

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 贪吃蛇小游戏1.0 项目编号&#xff1a;01 文章目录 贪吃蛇小游戏1.0一…

基于python深度学习的CNN图像识别鲜花-含数据集+pyqt界面

代码下载&#xff1a; https://download.csdn.net/download/qq_34904125/89383615 本代码是基于python pytorch环境安装的。 下载本代码后&#xff0c;有个requirement.txt文本&#xff0c;里面介绍了如何安装环境&#xff0c;环境需要自行配置。 或可直接参考下面博文进行…

定个小目标之刷LeetCode热题(21)

这是道技巧题&#xff0c;利用了 &#xff08;num - 1&#xff09;% n 计算下标的形式来将数组元素与数组索引产生映射关系&#xff0c;代码如下&#xff0c;可以看下注释 class Solution {public List<Integer> findDisappearedNumbers(int[] nums) {int n nums.lengt…

3分钟带手把手带你了解 FL Studio v21.2.3.4004 中文免费版(附中文设置教程)安装指南

3分钟带手把手带你了解 FL Studio v21.2.3.4004 中文免费版(附中文设置教程)安装指南&#xff0c;大家我是兔八哥爱分享&#xff0c;今天你带来的安装FL Studio 21破解版&#xff0c;纯正简体中文支持&#xff01; FL Studio 21 简称FL21&#xff0c;全称Fruity Loops Studio&a…

JDBC常见的几种连接池使用(C3P0、Druid、HikariCP 、DBCP)

前言 数据库连接池负责分配、管理和释放数据库连接&#xff0c;它允许应用程序重复使用一个现有的数据库连接&#xff0c;而不是重新建立一个。连接池技术尽可能多地重用了消耗内存的资源&#xff0c;大大节省了内存。通过使用连接池&#xff0c;将大大提高程序运行效率。常用的…

YOLOv10涨点改进创新MSAM注意力,通道注意力升级,魔改CBAM

目录 1,YOLO v10介绍 1.1 C2fUIB介绍 1.2 PSA介绍 1.3 SCDown 2.自研MSAM 2.1 自研MSAM注意力介绍 3.MSAM如何加入到YOLOv8 3.1 MSAM加入ultralytics/nn/attention/MsAM.py 3.2 修改tasks.py1)首先进行引用定义 3.3 yolov10n-MSAM.yaml 3.4 yolov10n-PSMSAM.yaml 改…

Intel平台,13600KF+3060Ti,虚拟机安装macOS 14(2024年6月)

距离上次装macOS虚拟机已经有一段时间了&#xff0c;macOS系统现在大版本升级的速度也是越来越快了&#xff0c;由于Office只支持最新三个版本的macOS&#xff0c;所以现在保底也得安装macOS 12了&#xff0c;我这次是用macOS 14做实验&#xff0c;13和12的安装方式和macOS 14一…

Java项目之消息队列(手写java模拟实现mq)【七、⽹络通信协议设计、消息队列服务器端实现、客户端实现】✔ ★

⼗⼀. ⽹络通信协议设计 定义 Request / Response /** 表示一个网络通信中的请求对象. 按照自定义协议的格式来展开的*/ public class Request {private int type;private int length;private byte[] payload;public int getType() {return type;}public void setType(int typ…

运算符及表达式+基本语句和函数使用的详细讲解

运算符及表达式 运算符及表达式 在C语言中&#xff0c;运算符是用于执行特定操作的符号&#xff0c;而表达式则是由运算符和操作数组成的式子。 1) 运算符 运算符的目数 单目运算符&#xff1a;只需要一个操作数&#xff0c;如 !&#xff08;逻辑非&#xff09;、&#xf…

10 C++11

10 C11 1、类型推导1.1 auto关键字1.2 auto类型推断本质 2、类型计算2.1 类型计算分类2.2 类型计算的四种规则2.3 返回值类型计算 3、列表初始化4、Lambda表达式4.1 前置知识4.2 Lambda表达式4.3 捕获表 5、右值引用5.1 概念5.2 左值引用和右值引用 6、移动语义 1、类型推导 1…

1992-2023年各省产业结构升级、产业结构高级化数据(含原始数据+计算过程+计算结果)(无缺失)

1992-2023年各省产业结构升级、产业结构高级化数据&#xff08;含原始数据计算过程计算结果&#xff09; 1、时间&#xff1a;1992-2023年 2、来源&#xff1a;国家统计局、统计年鉴 3、指标&#xff1a;国内生产总值、第一产业增加值、第二产业增加值、第三产业增加值、第一…