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

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

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

相关文章

【JKI SMO】框架讲解(二)

JKI State Machine 讲解 将JKI State Machine 模板拖曳到程序框图中, 如下图, 此模板会默认放置一个OK按钮在前面板中,用于提示用户如何增加一个简单的用户事件去使用此框架。 “Event Structure”,Idle:此分支可以设…

【JS重点17】原型链(面试重点)

一:原型链底层原理 以下面一段代码为例,基于原型对象(Star构造函数的原型对象)的继承使得不同构造函数的原型对象关联在一起(此处是最大的构造函数Object原型对象),并且这种关联的关系是一种链…

C#联合Halcon机器视觉框架源码—升级版

相较于之前的NxtVision,本软件代码架构更加合理,且新增ui设计器、原来的vb脚本改为C#脚本,并尝试将视觉与运动控制相结合,是一体化的框架。 对源码有需求的,订阅本专栏后,私信我领取。

活动集锦 | 英码科技积极参与行业盛会,AI赋能城市数字化转型

在当今数字经济时代,城市全域数字化转型已经成为提升城市管理效能、优化资源配置、推动经济发展的重要手段。英码科技始终致力于为企业打造高效、低成本的行业应用方案,助力企业实现数字化转型。近日,英码科技受邀参加了多场行业展示活动&…

操作系统复习-线程同步

互斥量 两个线程的指令交叉执行互斥量可以保证先后执行称为原子性 原子性是指一系列操作不可被中断的特性这一系列操作要么全部执行完成,要么全部没有执行不存在部分执行部分未执行的情况 互斥锁 互斥量是最简单的线程同步的方法互斥锁,处于两态之一的…

01 飞行器设计 —— 一门独立的学科

01 飞行器设计 —— 一门独立的学科 01 引言02 飞机设计概述2-1 什么是飞机设计?2-1 飞机设计是从哪里开始的?2-2 如何成为一名飞机设计师?2-4 本书的组织 参考文献 说明:关于Raymer的《Aircraft Design》的读书笔记; …

解读ROS功能包模块的步骤

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录前言解读ROS功能包模块的步骤前言 认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长! 推荐开发经验及方法博客专栏: [https:/…

哇塞,超好吃的麻辣片,一口就爱上

最近,我发现了一款让人欲罢不能的美食——食家巷麻辣片!😍 一打开包装,那浓郁的麻辣香气就扑鼻而来,瞬间刺激着我的嗅觉神经。😃食家巷麻辣片的外观色泽鲜艳,红通通的一片,看着就特…

Android断点续传原理及实现

常见两种网络请求方式 一、 HttpURLConnection HttpURLConnection的setRequestProperty()方法,对我们要读取的字节部分进行控制,比如: 1.Range0-100代表只读取前100个字节。 2.Range100-500代表读取从第100个字节开始,读到第500个字节为止。…

常见的宽基指数基金

指数基金投资指南 ❝ 这篇博客里面的内容主要来自于银行螺丝钉的《定投十年,财务自由》和《指数基金投资指南》这两本书中章“常见的宽基指数”,最近第三次读这本书,打算做一点笔记加深自己的印象。 博客中很多内容是从书中摘抄的&#xff0c…

【git使用三】git工作机制与命令用法

目录 git工作机制和相关概念 四个重要区域 分支的概念 上传代码到远程分支的基本流程 克隆代码 仓库同步 开发者如何提交代码到远程仓库分支 1.初始化本地仓库 2.关联本地仓库和远程仓库 创建关联 查看关联情况 如何解除关联 3.推送代码到远程仓库 3.1先下拉远程…

PyTorch计算机视觉入门:测试模型与评估,对单帧图片进行推理

在完成模型的训练之后,对模型进行测试与评估是至关重要的一步,它能帮助我们理解模型在未知数据上的泛化能力。本篇指南将带您了解如何使用PyTorch进行模型测试,并对测试结果进行分析。我们将基于之前训练好的模型,演示如何加载数据…

解决老毛子路由器自带微信提示功能无法触发问题

新买了一个二手的RM AC2100,刷了老毛子后,发现自带的上下线微信提示无法使用(方糖公众号无信息) 经我开启SSH,将上下线部分代码拿出来调试发现,发不出来的原因是原版信息发送长度过长,需要截取一部分才能发送成功。 …

【Android面试八股文】说一说JVM、DVM(Dalvik VM)和ART的区别

文章目录 1. JVM(Java Virtual Machine):2. DVM(Dalvik Virtual Machine):与JVM区别基于的架构不同执行的字节码不同3. ART(Android Runtime):与DVM的区别4. 什么是JIT?4.1 什么是JIT4.2 JIT 编译的优势包括:4.3 对于 DVM 和 ART,它们在 JIT(Just-In-Time)编译方…

【学习笔记】centos7安装mysql相关事项

究极恶心的体验 依赖要按照顺序安装,有些依赖安装位置也不同 非常细节 mysql安装包:mysql官网下载地址 centos7选择Red Hat Enterprise Linux 7 / Oracle Linux 7 (x86, 64-bit), RPM Bundle 下载版本自选 安装视频教程:centos7.5安装mysql …

消息队列-RabbitMQ-延时队列实现

死信队列 DLX,全称为Dead-Letter-Exchange,死信交换机,死信邮箱。当消息在一个队列中变成死信之后,它能重新发送到另外一个交换器中,这个交换器就是DLX,绑定DLX的队列就称为死信队列。 导致死信的几种原因: ● 消息…

Spring配置那些事

一、引言 配置是一个项目中不那么起眼,但却有非常重要的东西。在工程项目中,我们一般会将可修改、易变、不确定的值作为配置项,在配置文件/配置中心中设置。 比方说,不同环境有不同的数据库地址、不同的线程池大小等&#xff0c…

【计算机毕业设计】241外卖微信小程序

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

jadx+android studio+雷电模拟器 动态调试apk

# 环境准备 1.雷电模拟器,开启root 2.jadx: https://sourceforge.net/projects/jadx.mirror/files/v1.5.0/jadx-gui-1.5.0-with-jre-win.zip/download 3.java jdk 11 https://www.oracle.com/cn/java/technologies/javase/jdk11-archive-downloads.…

【文献阅读】Adaptive Arrays

符号表 由于论文内符号繁杂,这里写了一个符号表 符号含义 μ k l \mu_{kl} μkl​kl协方差项 n k n_k nk​K通道的复包络 n l n_l nl​L通道的复包络 μ l k \mu_{lk} μlk​kl协方差项的共轭 α \alpha α定义信号的幅度和时间变化 s k s_k sk​k信道中的信号 w …