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

news2024/9/23 19:22:26

摘要:

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.coloradmin.cn/o/1706563.html

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

相关文章

【数据分析面试】55. 寻找双词组 (Python)

题目: 寻找双词组 (Python) 编写一个名为 find_bigrams 的函数,该函数接收一个句子或段落的字符串,并按顺序返回其所有双词组的列表。 注意: 双词组是指连续的两个单词。 示例: 输入&#x…

gitLab 使用tortoiseGit 克隆新项目 一直提示tortoiseGitPlink输入密码 输完也不生效

问题描述:准备用TortoiseGit拉取gitlab上一个新项目代码,出现tortoiseGitPlink提示让输入密码,输入后又弹出,反复几次,无法down下来代码。 解决方案: 1.找到PuTTYgen工具,打开 2. 点击load 按钮…

Docker是什么?使用场景作用及Docker的安装和启动详解

目录 Docker是什么? Docker的发展 Docker的安装 Docker使用 Docker的运行机制 第一个Docker容器 进入Docker容器 客户机访问容器 Docker是什么? Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。 Docker …

网络安全防御之下一代防火墙部署思路分享

随着企业在数字化转型过程中不断深化,为了促进业务快速且安全地推出和更新,企业所采用的应用架构和部署方式经历了显著的演进:它们从单一应用转变为分层架构,进而发展为微服务架构;同时部署方式也由传统的本地部署进化…

区间选点问题-贪心-C++

问题: 给定 𝑁 个闭区间 [ai,bi],请你在数轴上选择尽量少的点,使得每个区间内至少包含一个选出的点。 输出选择的点的最小数量。 位于区间端点上的点也算作区间内。 输入格式 第一行包含整数 𝑁,表示区间数…

这样问问题, 客户才会下单!

和供应商沟通时,提问方式至关重要。如何提问是外贸交流的关键,而针对客户的合适提问更是促成交易的秘诀。前不久, 我有一个客户想要一个不属于我们行业的新品, 于是我准备去阿里巴巴找找供应商。但因为我对该领域并不了解&#xf…

MYSQL 使用子查询id数据做条件更新

举例,我想查出某个表里面符合条件的前5条数据的id 做数据更新 : 想法 报错 更正写法 : 示例: UPDATE t_authorisation_record ar1JOIN (SELECT IDFROM t_authorisation_recordWHERE device_company_name JCcccORDER BY id ASCLI…

Python代码:二十一、增加派对名单(二)

1、题目 描述 为庆祝驼瑞驰在牛爱网找到合适的对象,驼瑞驰通过输入的多个连续字符串创建了一个列表作为派对邀请名单,在检查的时候发现少了他最好的朋友“Allen”的名字,因为是最好的朋友,他想让这个名字出现在邀请列表的最前面…

边缘计算网关的用途及其使用方法-天拓四方

在数字化日益深入的今天,边缘计算网关作为一种重要的设备,正在越来越多地被应用于各种场景中。它不仅能够提升数据处理的速度和效率,还能在降低网络延迟的同时确保数据的安全性。本文将详细介绍边缘计算网关的用途及其使用方法,帮…

linux安装mysql后,配置mysql,并连接navicate软件

Xshell连接登陆服务器 输入全局命令 mysql -u root -p 回车后,输入密码,不显示输入的密码 注意mysql服务状态,是否运行等 修改配置文件my.cnf,这里没找到就找my.ini,指定有一个是对的 find / -name my.cnf 接下…

04_前端三大件JS

文章目录 JavaScript1.JS的组成部分2.JS引入2.1 直接在head中通过一对script标签定义脚本代码2.2创建JS函数池文件,所有html文件共享调用 3.JS的数据类型和运算符4.分支结构5.循环结构6.JS函数的声明7.JS中自定义对象8.JS_JSON在客户端使用8.1JSON串格式8.2JSON在前…

2024年zoom会议受主持人账户限制影响,无法加入会议。(错误代码13215)

问题一、老师,你好!我的zoom账户,刚开始注册后可以登录,但是现在登录不了了。代码1044。其次,我如果通过网页版设置会议号,别人也加入不了。代码13215。 这两个问题一般会同时出现。登录失败。(错误代码:1044)一般是创…

如何自动识别图片上的文字?一键转文本方法分享

如何自动识别图片上的文字?自动识别图片上的文字,即OCR技术,已经取得显著进步,并在多个领域得到广泛应用。它可以极大地提高我们处理文本信息的效率,无论是从文档扫描、图片识别,还是到自动翻译和数据录入&…

【干货】如何用SaaS商城助力全球化布局

在全球化的大潮中,企业如何迅速而有效地拓展海外市场,成为了众多企业家和管理者关注的焦点。随着技术的发展,SaaS(软件即服务)商城作为一种创新的商业模式,为企业全球化布局提供了强有力的支持。saas商城如…

Java整合EasyExcel实战——2 导出复杂表头

详情代码 实体类 Data public class ComplexHeadData {ExcelProperty({"主标题", "字符串标题"})private String string;ExcelProperty({"主标题", "日期标题"})private Date date;ExcelProperty({"主标题", "数字标…

学习云安全?就来亚马逊云科技中国峰会安全动手实验专场

一年一度的云计算春晚“亚马逊云科技中国峰会”明天就正式开始了,大会的注册将在5月28日今天晚18:00前停止报名,还没有报名的小伙伴请抓紧了!可以通过下方二维码注册大会。 小李哥也来提前带大家了解下本次大会中云安全相关的动手实验和活动&…

【NumPy】全面解析NumPy的sort函数:高效排序算法与应用技巧

🧑 博主简介:阿里巴巴嵌入式技术专家,深耕嵌入式人工智能领域,具备多年的嵌入式硬件产品研发管理经验。 📒 博客介绍:分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向…

基于瑞萨RA6M5的自控衣橱

1. 主控转接板原理图和PCB设计 2. 屏幕界面设计 3. 程序设计 4. QT设计 QT设计,读取MQTT数据,在QT上显示衣橱内部的温度,湿度情况,且能够控制衣橱的开关门,开关灯等。 5. 实物演示 瑞萨

Scala编程基础3 数组、映射、元组、集合

Scala编程基础3 数组、映射、元组、集合 小白的Scala学习笔记 2024/5/23 14:20 文章目录 Scala编程基础3 数组、映射、元组、集合apply方法数组yield 数组的一些方法映射元组数据类型转换求和示例拉链集合flatMap方法 SetHashMap apply方法 可以new,也可以不new&am…

大学搜题软件音乐类?分享三个支持答案和解析的工具 #微信#媒体

高效的学习工具可以帮助我们提高记忆力和理解能力,使知识更加深入人心。 1.彩虹搜题 这是个微信公众号 一款专门供全国大学生使用的查题神器!致力于帮助大学生解决学习上的难题,涵盖了大学生学习所需的学习资料。 下方附上一些测试的试题及答案 1、甲、乙合伙开…