《征服数据结构》双向链表

摘要:

1,双链表的介绍

2,双链表的用途

3,双链表的节点插入和删除

1,双链表的介绍

前面我们讲过单链表,单链表的特点就是只能往后访问不能往前访问。单链表一般在面试中用的比较多,比如删除倒数第 n 个节点,链表反转等,但在实际的工作中单链表用的并不多。比如Java中的LinkedList,LinkedHashMap等都是双链表。

双链表每个节点包含三个域,一个是数据域,两个指针域。两个指针域中一个指向前一个节点,一个指向后一个节点,如下图所示:

bf8912aabf94ec6abeef4ba6c5d67bf0.png

Java代码:

// 双链表节点类
class LinkNode {int val;// 节点中存储的数据。LinkNode pre;// 指向前一个节点的指针。LinkNode next;// 指向下一个节点的指针。public LinkNode(int val, LinkNode pre, LinkNode next) {this.val = val;this.pre = pre;this.next = next;}
}

C++语言:

// 双链表节点类
struct LinkNode {int val;// 节点中存储的数据。LinkNode *pre;// 指向前一个节点的指针。LinkNode *next;// 指向下一个节点的指针。LinkNode(int x, LinkNode *p, LinkNode *n) : val(x), pre(p), next(n) {}
};

单链表中因为只能从前往后遍历,我们只需要记录头节点head即可,但双链表中可以从后往前遍历,我们还需要记录尾节点tail,两个方向都可以遍历。如果不想记录尾节点,也可以让双链表的首尾相连,构成一个环形链表,只记录头节点head即可,从head开始沿着两个方向都可以访问。

4ee261d1c2ae40a5a56fffb68e9cba8a.png

2,双链表的用途

双链表的用途非常强大,除了当链表使用以外,还可以当做普通队列,双端队列,栈来使用,除此之外还可以用于数据的缓存,比如常见的LRU(Least Recently Used)缓存,LFU(least frequently used)缓存等。

在Android开发中图片的缓存一般使用的是LruCache,而LruCache继承的就是LinkedHashMap,LinkedHashMap就是一个双向链表。

他会把经常使用的数据插入到头节点head,这样不经常使用的数据就会越来越靠后,当存储数据足够多的时候,就会从尾节点tail往前删除,也就是把最不经常使用的数据给删除,即达到缓存的效果,又防止了数据量过大。

3,双链表的节点插入和删除

双链表的节点插入和删除与单链表一样,也是分三种情况,分别是在头部,尾部和中间,我们分别来看下。

3.1 头部插入:

1,创建新节点,让它的next指针指向head节点。

2,让head的pre指针指向新节点。

3,让head指向新节点。

3881430083ce260ca6492a96fcacec72.png

3.2 尾部插入:

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

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

相关文章

广东商标协会批复为世界酒中国菜的指导单位

广东商标协会批复荐酒师公司成为“世界酒中国菜”活动指导单位 一、批复背景与意义 广东商标协会正式批复荐酒师国际认证(广州)有限公司,成为备受瞩目的“世界酒中国菜”系列活动的指导单位。该活动旨在共建“一带一路”倡议、助力“乡村振兴…

Unity射击游戏开发教程:(28)敌人被摧毁时掉落的能量提升

在这篇文章中,我将介绍如何在敌人被摧毁时产生能量提升。 首先,有一个生成管理器,负责生成敌人和能量提升。我正在对其进行转换,以便当敌人被摧毁时,有可能会掉落能量。本文将仅介绍当敌人被摧毁时掉落的能量道具。我将介绍为电源添加一个平衡的生成系统。 Spawn Manager…

最简单的 UDP-RTP 协议解析程序

最简单的 UDP-RTP 协议解析程序 最简单的 UDP-RTP 协议解析程序原理源程序结果下载链接参考 最简单的 UDP-RTP 协议解析程序 本文介绍网络协议数据的处理程序。网络协议数据在视频播放器中的位置如下所示。 本文中的程序是一个 UDP/RTP 协议流媒体数据解析器。该程序可以分析 …

Sqli-labs-master靶场1-20通关教程

目录 SQL注入基本语句 Less-1(字符型-闭合 ) Less-2(数字型) Less-3(字符型-闭合 ) ) Less-4(字符型-闭合 ") ) Less-5(报错注入-闭合 ) Less-…

激光雷达测试板智能系统应用

在自动驾驶技术和机器人感知系统的迅猛发展中,激光雷达(Lidar)作为一种先进的测距技术,正逐渐成为这些系统不可或缺的组成部分。而在这一技术的实际应用前,对激光雷达进行精确的测试和校准是至关重要的一步。激光雷达测…

【原创】java+springboot+mysql日程管理系统设计与实现

个人主页:程序猿小小杨 个人简介:从事开发多年,Java、Php、Python、前端开发均有涉猎 博客内容:Java项目实战、项目演示、技术分享 文末有作者名片,希望和大家一起共同进步,你只管努力,剩下的交…

基于tensorflow的咖啡豆识别

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 一、前期工作 1. 设置GPU import tensorflow as tfgpus tf.config.list_physical_devices("GPU")if gpus:tf.config.experimental.set_memory_gr…

全球伦敦银收盘时间一致吗

跟伦敦金市场相似,伦敦银市场也是一个全球化的无形市场,无论来自世界上什么地方的投资者参与其中,都可以得到全天接近24个小时的连贯行情,只要精力足够,根本不用担心没有交易获利的机会。但由于交易平台始终有维护的需…

轻松实现PDF文件的在线浏览

福昕软件最近发布了一款名为Cloud API的产品,通过几行代码即可轻松实现PDF文件的在线浏览。先一睹为快吧。 简介 先看看产品官网:福昕 Cloud API Cloud API包括两个形态产品,一个是在线的PDF查看工具,叫PDF Embed API,另外一个…

git 学习(一)

一、版本控制 (一)介绍 版本迭代 每一次更新代码 都会出现新的版本如果我们需要之前的版本的文件 我们就得需要版本控制的文件 每一次更新的结果我们都保存下来 多人开发必须要用版本控制器 否则代价会很大 (二)主流的版本控制…

uniapp开发微信小程序:用户手机号授权获取全流程详解与实战示例

随着多端小程序研发工具的日益普及,诸如uniapp、Taro、Flutter等跨平台解决方案使得开发者能够高效地构建同时适配多个主流小程序平台(如微信、支付宝、百度、字节跳动等)的应用。尽管各平台间存在一定的差异性,但在获取用户手机号…

防火墙技术基础篇:基于Ensp配置防火墙NAT server(服务器映射)

配置防火墙NAT server(服务器映射) 什么是NAT Server (服务器映射) NAT(Network Address Translation,网络地址转换)是一种允许多个设备共享一个公共IP地址的技术。NAT Server,也称为服务器映射,是NAT技术中的一种应…

7 Series FPGAs Integrated Block for PCI Express IP核设计中的物理层控制核状态接口

物理层控制和状态允许用户应用程序根据数据吞吐量和电源需求来更改链路的宽度和速度。 1 Design Considerations for a Directed Link Change 在Directed Link Change(定向链接更改)期间需要注意的事项有: 链接更改操作(Link c…

C++STL---模拟实现string

我们这篇文章进行string的模拟实现。 为了防止标准库和我们自己写的string类发生命名冲突,我们将我们自己写的string类放在我们自己的命名空间中: 我们先来搭一个class string的框架: namespace CYF{ public://各种成员函数 priva…

基于单片机智能防触电装置的研究与设计

摘 要 : 针对潮湿天气下配电线路附近易发生触电事故等问题 , 对单片机的控制算法进行了研究 , 设 计 了 一 种 基 于 单片机的野外智能防触电装置。 首先建立了该装置的整体结构框架 , 再分别进行硬件设计和软件流程分析 &#xf…

IDEA升级web项目为maven项目乱码

今天将一个java web项目改造为maven项目。 首先&#xff0c;创建一个新的maven项目&#xff0c;将文件拷贝到新项目中。 其次&#xff0c;将旧项目的jar包&#xff0c;在maven的pom.xml做成依赖 接着&#xff0c;把没有maven坐标的jar包在编译的时候也包含进来 <build>…

实战教程:使用Go的net/http/fcgi包打造高性能Web应用

实战教程&#xff1a;使用Go的net/http/fcgi包打造高性能Web应用 简介理解FCGI协议FastCGI工作原理CGI与FastCGI对比其他接口对比 初步使用net/http/fcgi包设置和配置基础环境一个简单的FastCGI应用示例本地测试与调试 深入net/http/fcgi包的高级用法探索net/http/fcgi的主要功…

气膜建筑的运行保障:应对停电的解决方案—轻空间

气膜建筑作为一种现代化的建筑形式&#xff0c;以其独特的结构和多样的应用赢得了广泛关注。这种建筑依靠风机不断往内部吹气来维持其结构形态&#xff0c;那么如果遇到停电的情况&#xff0c;该如何确保其正常运行呢&#xff1f; 气膜建筑的供风系统 气膜建筑内部的气压维持依…

信创崛起:从安可到国产化,中国信息技术创新之路

在信息技术迅速演进的时代背景下&#xff0c;几个核心概念日益凸显其重要性&#xff1a;安全可靠&#xff08;简称安可&#xff09;、信息技术创新&#xff08;简称信创&#xff09;&#xff0c;以及国产化。这些概念紧密关联&#xff0c;共同服务于一个宏伟目标——构建一个独…

MFC 发起 HTTP Post 请求 发送MES消息

文章目录 获取Token将获取的Token写入JSON文件 将测试参数发送到http首先将测试参数写入到TestData.JSON文件rapidjson 库需要将CString 进行类型转换才能使用&#xff0c;将CString 转换为const char* 发送JSON 参数到http中&#xff0c;并且获取返回结果写入TestFinish.JSON文…