链表:虚拟头节点你会用吗?

news2024/11/27 15:41:32

大家好,我是三叔,很高兴这期又和大家见面了,一个奋斗在互联网的打工人。

前言:什么是链表

什么是链表,链表是一种通过指针串联在一起的线性结构,每一个节点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域指向null(空指针的意思)。

链表的入口节点称为链表的头结点也就是head。
在这里插入图片描述
如上图,是一个单链表,单链表的指针只能指向下一个data域。链表的节点在内存中是分散存储的,通过指针连在一起;链表的最后一个节点的引用为空,表示链表的结束,也就是我们所说的空指针。

为什么要引入虚拟头节点

虚拟头节点是一个在链表头部添加的额外节点,它不存储任何实际的数据,只是作为辅助。虚拟头节点的引入可以简化链表操作的逻辑,并解决一些特殊情况下的边界问题。

通过引入虚拟头节点,我们可以在处理链表时统一操作逻辑。无论是在链表的开头、中间还是末尾插入或删除节点,我们都可以使用相同的逻辑进行操作。这减少了代码中的条件判断,使得代码更加简洁和易于理解。

虚拟头节点还能够解决空链表的情况。如果链表为空且没有虚拟头节点,我们需要对空链表和非空链表进行不同的处理。然而,通过添加虚拟头节点,链表的头部始终存在,我们可以统一对链表进行处理,无论链表是否为空。

举例说明:

比如有一条链表,现在我要对链表中的某个节点进行删除操作,现在我要将链表中的第三个节点删除,那么应该怎么操作?
在这里插入图片描述
如图所示:我只需要将2的指针域 next 指向下一个节点,也就是第四个节点;此时需要注意的是,在c语言中,data域3还在内存中,需要手动释放内存,但是在java中,则不需要自己去手动释放内存。

同理,新增操作如下:
在这里插入图片描述
我们只需要将2的指针next指向新增的对象,新增的对象的指针域next指向节点3,这样就成功在节点2和3之间插入了新增节点。

删除链表元素:使用虚拟节点(Dummy Head Node)

正如我上面所说,如果删除链表中的某个元素,只需要删除的这个值的前一个对象的指针指向删除对象的下一个值即可,但是如果我现在删除的对象是链表的第一个元素,那该怎么办,已经是第一个元素了前面已经没有指针域指向下一个值了。

移除头结点和移除其他节点的操作是不一样的,因为链表的其他节点都是通过前一个节点来移除当前节点,而头结点没有前一个节点。所以头结点如何移除呢,其实只要将头结点向后移动一位就可以,这样就从链表中移除了一个头结点。这样移除了一个头结点,你会发现,在单链表中移除头结点 和 移除其他节点的操作方式是不一样,需要单独写一段逻辑来处理移除头结点的情况。

我们来看一个示例应用,展示虚拟头节点如何简化链表操作。假设我们要在一个有序链表中插入一个新节点。如果没有虚拟头节点,我们需要单独处理链表为空和不为空的情况。而有了虚拟头节点,我们只需要找到插入位置,创建新节点,并更新引用即可,无需特殊处理空链表情况。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode removeElements(ListNode head, int val) {
        if(head == null) {
            return head;
        }
        ListNode dummy = new ListNode(-1, head);// 设置虚拟首节点
        ListNode cur = head;// 临时节点
        ListNode pre = dummy;
        while(cur != null) {
            if(cur.val == val) {
                pre.next = cur.next;    
            } else {
                pre = cur;
            }
            cur = cur.next;
        }
        return dummy.next;// 注意,返回的是虚拟节点的下一个节点,因为虚拟节点只是我们定义的,不是真正意义上存在数据的节点,虚拟节点的next节点才是真正的头节点
    }
}

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

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

相关文章

提高用户忠诚度的 4 种客户保留策略

什么是客户保留?简而言之,客户保留是指企业用来鼓励现有客户群重复购买和持续忠诚度的策略和战术。根据最近的研究,多达68%的客户在觉得公司不重视他们的业务时会转向竞争对手。 这就是为什么客户保留对各行各业的企业都如此重要的原因。与获…

《程序员面试金典(第6版)》面试题 16.25. LRU 缓存(自定义双向链表,list库函数,哈希映射)

题目描述 设计和构建一个“最近最少使用”缓存,该缓存会删除最近最少使用的项目。缓存应该从键映射到值(允许你插入和检索特定键对应的值),并在初始化时指定最大容量。当缓存被填满时,它应该删除最近最少使用的项目。 题目传送门:…

消息队列内容

问题有哪些? (1)消息队列为什么会出现? (2)消息队列能用来干什么? (3)使用消息队列存在的问题? (4)如何解决重复消费的问题&#…

PyCharm安装使用教程

简介 PyCharm是一种PythonIDE(Integrated Development Environment,集成开发环境),带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,比如调试、语法高亮、项目管理、代码跳转、智能提示、自动完成、单…

docker-安装redis集群

目录 1.服务器列表 2.安装docker 3.docker内网IP地址配置 4.docker安装redis集群 1.选择合适数据位置 2.循环生成redis配置目录 3.打开宿主机防火墙端口 4.循环生成redis容器 5.创建集群命令 6.命令行集群验证 1.服务器列表 服务器列表 nameip远程端口用户名/密码cen…

One2Multi Graph Autoencoder for Multi-view Graph Clustering

One2Multi Graph Autoencoder for Multi-view Graph Clustering | Proceedings of The Web Conference 2020 (acm.org) 目录 Abstract 1 Introduction 2 Model 2.1 Overview 2.2 One2Multi Graph Convolutional Autoencoder Informative graph convolutional encoder M…

Eclipse教程 Ⅸ

今天继续来学习Eclipse 快速修复、Eclipse 浏览菜单、Eclipse 查找以及Eclipse 悬浮提示的内容!老规矩,废话不多说,开始吧。 Eclipse 快速修复 使用快速修复 在 Eclipse 编辑器中当你输入字母时,编辑器会对你输入的内容进行错误…

PostgreSQL FDW

一、FDW简单理解 FDW (foreign-data wrapper,外部数据包装器),PostgreSQL FDW 是一种外部访问接口,它可以被用来访问存储在外部的数据,这些数据可以是外部的pg数据库,也可以oracle、mysql等数据库,甚至可以…

大气气溶胶期末复习笔记

大气气溶胶期末复习笔记 大气气溶胶 广义:指悬浮在大气中的各种固态和液态微粒与大气构成的混合体系 狭义:指大气中悬浮的各种固态粒子,简称气溶胶粒子 来源 直接注入 通过地表直接注入大气固体,液体物质的破碎过程中产生&…

筛质数—(埃氏筛欧拉筛)

埃氏筛&欧拉筛 埃氏筛欧拉筛 例题:AcWing 868. 筛质数 对欧拉筛的理解不是很深刻,写下自己的理解,加深一下理解,也方便后期忘记后再学习 埃氏筛 埃氏筛的主要思想是让质数x去筛掉x的所有合数,这个比较容易理解。…

机器学习知识经验分享之五:R语言安装

python语言用于深度学习较为广泛,R语言用于机器学习领域中的数据预测和数据处理算法较多,后续将更多分享机器学习数据预测相关知识的分享,有需要的朋友可持续关注,有疑问可以关注后私信留言。 目录 一、R语言介绍 二、R语言安装…

装饰器模式:实现类功能的动态扩展

一,简介 装饰器模式(Decorator Pattern)是一种结构型设计模式,它允许在不修改原有类结构的情况下,给一个对象动态添加额外的职责。通常情况下,扩展一个类的功能我们首先会想到用继承方式来实现&#xff0c…

7步搞懂手写数字识别Mnist

大家好啊,我是董董灿。 图像识别有很多入门项目,其中Mnist 手写数字识别绝对是最受欢迎的。 该项目以数据集小、神经网络简单、任务简单为优势,并且集合了CNN网络中该有的东西,可谓麻雀虽小,五脏俱全。 非常适合新手…

Fourier分析入门——第12章——Fourier变换的性质

目录 第12章 Fourier变换的性质 12.1 引言 12.2 Fourier变换性质的相关定理 12.2.1 线性定理(Linearity) 12.2.2 伸缩性定理(Scaling) 12.2.3 时间/空间平移定理(Shift) 12.2.4 频移定理 12.2.5 调制定理(Modulation) 12.2.6 微分定理(Differentiation) 12.2.7 积分定…

冒泡排序详解(Bubble Sort)

本文已收录于专栏 《算法合集》 目录 一、简单释义1、算法概念2、算法目的3、算法思想4、算法性质 二、核心思想构建排序 三、图形展示宏观展示微观展示 四、算法实现实现思路代码实现客户端调用构造堆的方法元素交换的方法元素比较的方法 运行结果 五、算法描述1、问题描述2、…

数据库管理-第七十八期 记第一次数据库吐槽大会(20230530)

数据库管理 2023-05-30 第七十八期 记第一次数据库吐槽大会1 主席2 三六九等3 数据库吐槽大会总结 第七十八期 记第一次数据库吐槽大会 昨天晚上终于还是把Exadata X9M-2和之前用于展示RAC搭建及升级的那套库做好了ADG,这部分操作在整理后会在下个月发出来。因为之…

Python列表类型的使用

文章目录 Python中的列表类型一、列表的常用操作二、列表的增删改查三、列表常用的函数 Python中的列表类型 将各个元素用方括号([])括起来,用逗号(,)分隔开,这种形式的数据类型就是列表。各个元素的数据类…

HNU-电子测试平台与工具2-串口实验5次

计算机串口使用与测量 【实验属于电子测试平台与工具】 湖南大学信息科学与工程学院 计科 210X wolf (学号 202108010XXX) 0.环境搭建 在实验开始之前,安装好Ubuntu 20.04操作系统。(这个没有难度) 但要提醒的是,这个ubuntu是xubuntu,而且虚拟硬盘只有10GB的大小…

智警杯1.4---excel可视化

视频要点: 首先就是有数据透视表 点击数据透视表,分析,字段项目, 切片器筛选 切片器(我希望用什么对数据进行一个筛选) 跟下拉列表有点像,只不过切片器仅仅之对于数据透视表 依旧需要用su…

HBase集群搭建

hbase 1.解压HBase安装包 先 下载HBase压缩包,并解压安装文件,示例代码如下: tar -zxvf hbase-2.0.1-bin.tar.gz2. 修改配置文件 编辑 conf目录下的 hbase-env.sh文件,示例代码如下: cd conf vi hbase-env.sh添加…