线性表之双向链表

1. 双向链表的结构

对于单向链表和单向循环链表而言有一个共同的特点,就是链表的每个节点都只有一个指向后继节点的指针,通过这个指针我们就可以从前往后完成对链表的遍历。但是开弓没有回头箭,遍历到尾节点之后再想要回到头结点,是无能为力的。

1.1 双向链表的节点

为了克服链表单向性这一缺点,聪明的程序猿们便进行了改进,设计出了双向链表。双向链表(Doubly Linked List)是一种常见的数据结构,与单向链表不同的是,双向链表中的每个节点包含两个指针,一个指向前驱节点,一个指向后继节点。双向链表的这种特性使得我们可以从任意节点高效地向前或向后遍历。

假设双向链表的节点存储的是整形数据,那么该节点的定义如下:

// 定义一个节点,此为 C++ 语法
struct Node
{int data = 0;Node* next = nullptr;Node* prev = nullptr;
};

双向链表的节点结构包含三个部分:

  • 数据域(data):存储节点的值
  • 前驱指针(prev):指向前一个节点
  • 后继指针(next):指向后一个节点

在操作双向链表的时候通常会定义两个辅助指针:头节点指针和尾节点指针,头指针指向链表的第一个节点,尾指针指向链表的最后一个节点。

2. 双向链表的操作

2.1 链表的遍历

由于双向链表的节点中有前驱和后继指针,所以在遍历它的时候有两种方式:正向遍历和反向遍历。

正向遍历双向链表的过程(从头到尾):

  • 从第一个数据节点开始,带头结点:从头结点的后继节点开始遍历
  • 访问当前节点的数据,并通过next指针移动到下一个节点
  • 重复步骤2,直到到达链表的末尾(即当前节点的next为nullptr)

反向遍历双向链表的过程(从尾到头):

  • 从尾节点开始(前提条件:需要先找到尾节点)
  • 访问当前节点的数据,并通过prev指针移动到上一个节点
  • 重复步骤2,直到到达链表的头部,判定条件为:带头结点:当前节点为头结点

2.2 链表的插入

2.2.1 带头结点的插入

场景1:在头部和中间位置插入新节点

        对于带头节点的链表而言,在头部插入节点就是把新的数据节点作为链表的第一个数据节点,它是头结点的后继节点。

在链表的头部和中间位置(pos)插入新节点需要分以下几步:

  • 创建一个新的节点,并初始化,记作newNode
  • 遍历链表找到pos-1位置的节点,记作preNode
  • 将新节点的后继节点设置为pos位置的节点,也就是newNode->next = preNode->next
  • 将新节点的前驱节点设置为pos-1位置的节点,也就是newNode->prev = preNode
  • 重置pos位置节点的前驱,设置为newNode节点,也就是preNode->next->prev = newNode
  • 重置preNode节点的后继,设置为newNode,即:preNode->next = newNode

温馨提示:第5、6步不能放到第3、4步之前处理。

下图是将新节点插入到链表的非第一个数据节点的位置:


下图是将新节点作为第一个数据节点插入到链表中:

场景2:在尾部插入新节点

在链表的尾部添加新节点就是让它作为原来的尾节点的后继,新节点的前驱是原来的尾节点。主要的操作步骤如下:

  • 遍历链表并找到它的尾节点,记作tailNode
  • 创建一个新的链表节点,记作newNode,并设置它的后继,有两种方式:
    • newNode->next = nullptr
    • newNode->next = tailNode->next
  • 将newNode节点的前驱设置为tailNode,即:newNode->prev = tailNode
  • 更新tailNode节点的后继节点,tailNode->next = newNode

2.3 链表的删除

2.3.1 带头结点的删除

场景1:删除头部和中间位置的节点

对于带头结点的链表而言,所谓的删除头部节点指的就是删除链表中的第一个数据节点。

删除头部和中间位置(pos)的节点的处理流程如下:

  • 遍历链表,搜索链表的节点,找到要删除的节点的上一个节点(pos-1),记作preNode
  • 通过preNode找到要删除的节点,记作delNode
    • delNode = preNode->next
  • 更新preNode节点的后继为pos+1位置的节点,即:preNode->next = delNode->next
  • 更新pos+1位置节点的前驱为preNode,即:delNode->next->prev = prevNode
  • 释放delNode节点指向的内存资源

下图为删除链表第一个数据节点的示意图:

下图为删除链表中间位置的数据节点的示意图:

场景2:删除尾部节点

删除链表尾部节点的处理流程如下:

  • 遍历链表找到链表的倒数第二个(pos-1位置)节点,记作preNode
  • 通过preNode找到要删除的节点,记作delNode
    • delNode = preNode->next
  • 让preNode节点的后继指针指向空,有两种处理方式
    • preNode->next = nullptr
    • preNode->next = delNode->next
  • 释放delNode节点指向的内存资源

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

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

相关文章

Python(TensorFlow)和MATLAB及Java光学像差导图

🎯要点 几何光线和波前像差计算入瞳和出瞳及近轴光学计算波前像差特征矩阵方法计算光谱反射率、透射率和吸光度透镜像差和绘制三阶光线像差图和横向剪切干涉图分析瞳孔平面焦平面和大气湍流建模神经网络光学像差计算透镜光线传播几何偏差计算像差和像散色差纠正对齐…

lambda表达式用法——C#学习笔记

“Lambda 表达式”是一个匿名函数,它可以包含表达式和语句,并且可用于创建委托或表达式目录树类型。 实例如下: 代码如下: using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.…

表连接查询之两个left join与递归SQL

一、如下SQL1 SELECT i.*,su1.name as createName,su2.name as updateNameFROM information ileft join sys_user su1 on su1.idi.create_idleft join sys_user su2 on su2.idi.update_id 二、分析 1、SELECT i.*,su.name as createName,sua.name as updateName: 这…

负载均衡 Ribbon 与 Fegin 远程调用原理

文章目录 一、什么是负载均衡二、Ribbon 负载均衡2.1 Ribbon 使用2.2 Ribbon 实现原理 (★)2.3 Ribbon 负载均衡算法 三、Feign 远程调用3.1 Feign 简述3.2 Feign 的集成3.3 Feign 实现原理 (★) 一、什么是负载均衡 《服务治理:Nacos 注册中心》 末尾提到了负载均…

污点、容忍、不可调度、排水、数据卷

目录 污点taint 污点的格式 1. key:effect 键名:污点类型 2. keyvalue:effect 键名数值:污点类型 污点的类型 1. NoSchedule 2. PreferNoSchedule 3. NoExecute(驱逐) 设置污点(主节点操作&#xff09…

[论文笔记]大模型微调数据配比策略

大模型微调数据配比策略 How Abilities in Large Language Models are Affected by Supervised Fine-tuning Data Composition https://arxiv.org/pdf/2310.05492 一、背景: 大模型是无监督的多任务学习器,其强大的泛化能力可以同时理解并执行多种任务…

PointNet++改进策略 :模块改进 | PAConv,位置自适应卷积提升精度

题目:PAConv: Position Adaptive Convolution with Dynamic Kernel Assembling on Point Clouds来源:CVPR2021机构:香港大学论文:https://arxiv.org/abs/2103.14635代码:https://github.com/CVMI-Lab/PAConv 前言 PA…

elasticsearch文档Delete By Query API(一)

这里的查询需要使用和Search API(后文会讲)相同的方式来将查询条件作为query的值传递,当然也可以使用q关键字,例如如下请求: curl -X POST “localhost:9200/twitter/_delete_by_query?pretty&quser:kimchy” -H…

HTTP 二、进阶

四、安全 1、TLS是什么 (1)为什么要有HTTPS ​ 简单的回答是“因为 HTTP 不安全”。由于 HTTP 天生“明文”的特点,整个传输过程完全透明,任何人都能够在链路中截获、修改或者伪造请求 / 响应报文,数据不具有可…

log4j 清除MDC上下文 MDC分类日志

在项目里需要分类收集处理日志信息,使用 log4j的MDC在线程中添加分类信息。不过最近却出现日志信息记录错误的情况,具体来说,就是会出现本来是属于下一个分类的一部分信息莫名的记录到上一个分类的日志文件中了。这很显然是MDC信息错误造成的…

【2024 CCF编程能力等级认证(GESP)Python 】一级大纲

目录 1. 背景2. 考核知识块3. 考核内容3.1 计算机基础知识3.2 编程规范3.3 基础语法3.4 数据类型3.5 三大基本结构3.6 运算符3.7 模块导入与输入输出3.8 Turtle绘图4. 考核目标5. 题型分布6. 考试时长7. 认证时间与报名8. 政策与福利9. GESP一级认证形式 1. 背景 官网&#xff…

[UVM]3.核心基类 uvm_object 域的自动化 copy() compare() print() pack unpack

1.核心基类:uvm_object (1)虚类只能声明,不能例化。 (2)uvm_object提供的方法 2.域的自动化(field automation) (1)简述 (2)示例 格…

php、Java、python酒店预约与送餐系统 酒店管理系统 酒店预订入住系统(源码、调试、LW、开题、PPT)

💕💕作者:计算机源码社 💕💕个人简介:本人 八年开发经验,擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等,大家有这一块的问题可以一起交流&…

C++系统教程001

1. 安装 Dev-C编程软件 2. 熟悉 Dev-C的界面 3. cout 输出语句的使用 4. 学会 C程序的编译运 一、认识编译器 我们平时所说的程序,一般指双击后就可以直接运行的程序,这样的程序又称为可执行程序。Windows系统下,可执行程序的后缀一般为.ex…

The Llama 3 Herd of Models【论文原文下载】

关注B站可以观看更多实战教学视频:hallo128的个人空间 The Llama 3 Herd of Models【论文原文】 点击下载:原文下载链接 摘要 现代人工智能(AI)系统由基础模型驱动。本文介绍了一组新的基础模型,称为 Llama 3。它是…

PostgreSQL的repmgr工具介绍

PostgreSQL的repmgr工具介绍 repmgr(Replication Manager)是一个专为 PostgreSQL 设计的开源工具,用于管理和监控 PostgreSQL 的流复制及实现高可用性。它提供了一组工具和实用程序,简化了 PostgreSQL 复制集群的配置、维护和故障…

欺诈文本分类检测(十):QLora量化微调

1. 引言 前文微调方法概览总结了微调的各种方法,并且在更前面两篇文章Lora单卡训练 和 lora单卡二次调优中已经尝试过用Lora进行微调,本文出于好奇准备尝试下用QLora进行微调的效果。 QLoRA是一种新的微调大型语言模型(LLM)的方…

使用Python的Elasticsearch客户端 elasticsearch-py 来完成删除现有索引、重新创建索引并测试分词的示例代码

以下是一个使用Python的Elasticsearch客户端 elasticsearch-py 来完成删除现有索引、重新创建索引并测试分词的示例代码 一、安装依赖 pip install elasticsearch二、运行效果 三、程序代码 from elasticsearch import Elasticsearch, NotFoundError# 连接到Elasticsearch es…

PS系统教程32

调色之单通道调色 上次分享内容调色可通过 色阶调色曲线调色 案例-复古 CtrlM调出曲线图选择单色通道-蓝色降到1/2绿色降1/4红色定点上拉 冷风 Alt复位降到1/2绿色降1/4红色定点下拉 调色-色相饱和度(ctrlu) 原图 只改变背景不改变蜥蜴的颜色 对比…

SpringBoot中@SchedulerLock注解实现定时任务中分布式锁的使用

背景 在SpringBoot项目中经常会去写一些定时任务,但是当我们的服务的实例部署多个的情况下,那么每个实例中的定时任务都会执行一遍,这显然不是我们想要的,我们只想让它执行一次。在没有引入像xxl-job之类的分布式任务调度框架的前…