首页 > 其他分享 >为什么要使用虚拟头结点(哑结点)?

为什么要使用虚拟头结点(哑结点)?

时间:2023-10-27 16:46:47浏览次数:43  
标签:为什么 结点 删除 head 链表 哑元 虚拟 节点

1. 总结

在对链表进行操作时,一种常用的技巧是添加一个哑节点(dummy node),它的 next 指针指向链表的头节点。这样一来,我们就不需要对头节点进行特殊的判断了。

例如,如果我们要删除节点 y,我们需要知道节点 y 的前驱节点 x,并将 x 的指针指向 y 的后继节点。但由于头节点不存在前驱节点,因此我们需要在删除头节点时进行特殊判断。但如果我们添加了哑节点,那么头节点的前驱节点就是哑节点本身,此时我们就只需要考虑通用的情况即可。

总而言之,当处理head节点和处理其余节点需要用到不同做法时(因为head前面没有节点),为了统一做法需要用到哑元。

2. 例子

(1)以单链表节点删除问题为例:
模型:1 -> 2 -> 3 -> 4

删除节点2,3,4,只需要遍历时保存下待删除节点的前驱节点,然后修改前驱节点的next就好了,可是删除首元节点1时还需要判断是否是该节点是否是head指向的节点,如果是就还要移动head指针指向新的首元节点.

dummy -> 1 -> 2 -> 3 -> 4

而引入了哑元节点,对于1的删除也可以和后面的2,3,4的操作一样了,这样可以不用做边界条件判断

(2)以链表节点顺序交换问题为例:
链表节点顺序交换问题一般需要三个指针。

两两交换问题
见 【24.两两交换链表中的节点】

模型:pre->l1->l2->rest (l1,l2为待交换的两个结点)

很明显,交换头两个节点和交换其它相邻两个节点用到的方法是不同的,因而需要用到哑元。如果不用哑元而交换头两个节点又用相同方法,则由于待交换节点是从头两个节点开始的,而head之前又没有节点,那么pre就没有意义。

(3)链表反转问题
见 【206.反转链表】
只需要将操作节点插入到head之前即可,根本不需要操作head,因此不需要用到哑元。

(4)删除倒数第n个节点
见【19. 删除链表的倒数第 N 个结点】(https://www.cnblogs.com/trmbh12/p/17792635.html)

标签:为什么,结点,删除,head,链表,哑元,虚拟,节点
From: https://www.cnblogs.com/trmbh12/p/17792666.html

相关文章

  • 易语言银行余额虚拟生成器制作,提供源码思路,仅供学习
    今天这边带来的是一个图片生成器,是用易语言进行开发的,整个代码我算了一下不超过10行,然后就需要一个图片框组件和三个编辑框,三个标签,一个按钮就能实现,真的非常非常简单,大家可以照猫画虎哈,这也仅仅只是为大家做的一个演示示范。软件截图:程序集源码分享:.版本2.程序集窗口程......
  • 关于虚拟机突然卡住,xshell连接掉了且无法重连的问题
    遇事莫慌,笔者当时的情况是刚配好spark,突然发现xshell中node1节点的连接掉了,重连也连不上,于是打开虚拟机,发现页面卡住,强制关也关不掉。于是从bing上找解决方案:直接打开服务,想装*就win+r,services.msc,找到vmware的相关进程,好像是四个,将启动类型全部改为禁止,然后关机..重启完再打开进......
  • 理解Postgres的IOPS:为什么数据即使都在内存,IOPS也非常重要
    理解Postgres的IOPS:为什么数据即使都在内存,IOPS也非常重要磁盘IOPS(每秒输入/输出操作数)是衡量磁盘系统性能的关键指标。代表每秒可以执行的读写操作数量。对于严重依赖于磁盘访问的PG来说,了解和优化磁盘IOPS对实现最佳性能至关重要。本文讨论IOPS相关主题:IOPS是什么、如何影响PG、......
  • 每天5分钟复习OpenStack(七)内存虚拟化
    标题中的存储虚拟化,涉及到两个方面,分别是内存和磁盘的虚拟化技术。内存的虚拟化就不得不提EPT和VPID技术.首先申明下本人其实不想写一些纯理论的东西,但是架不住面试经被问,为此特将一些特别复杂的技术底层都隐去,尽量将技术讲的简单,我个人信奉一句话'Ifyoucan'texplainits......
  • 虚拟DOM
      ......
  • 为什么要学音视频?
    来源:来自Twitter-X2Rtc一直都在说“科技改变生活”,现实告诉我们这是真的。随着通信技术和5G技术的不断发展和普及,不仅拉近了人与人之间的距离,还拉近了人与物,物与物之间的距离,万物互联也变得触手可及。基于此背景下,音视频技术也成为了主流,与此同时,便催生出了大量的音视频需求,但目前......
  • 如何在Ubuntu20.04.3机器上使用kvm创建CentOs7.9的虚拟机
    一、虚拟化背景因为产品在Ubuntu的环境上部署兼容性差,Ubuntu的实体机上还运行着其他系统没办法进行系统的更换重装,所以只能出此下策~二、开始搭建更新Ubuntu系统打开终端并通过如下命令更新本地的软件包索引$sudoaptupdate$sudoaptupgrade检查虚拟化是否开启在......
  • 【Python】venv、virtualenv _ 虚拟环境库
    虚拟环境:从电脑独立开辟出来的python环境,可以把它看作一个容器,我们可以在这个容器(环境)中安装我们项目中所依赖的相关模块和包。 虚拟环境的优点1.不同的虚拟环境相互独立,不会影响到其他应用。2.防止出现包管理混乱和版本冲突。3.不会影响全局的python环境。   ......
  • 字节一面:post 为什么会发送两次请求?被问懵了…
    前言最近博主在字节面试中遇到这样一个面试题,这个问题也是前端面试的高频问题,因为在前端开发的日常开发中我们总是会与post请求打交道,一个小小的post请求也是牵扯到很多知识点的,博主在这给大家细细道来。同源策略在浏览器中,内容是很开放的,任何资源都可以接入其中,如JavaScrip......
  • 虚拟机初始化配置
    虚拟机初始化配置网络配置在vmvare的虚拟网络编辑器中找到可用的网段打开虚拟网络编辑器进入设置,虚拟机可设置的ip范围就是192.168.239.128—192.168.239.254。在linux的配置文件中配置静态IP配置文件路径vim/etc/sysconfig/network-scripts/ifcfg-ens33TYPE=......