当前位置: 首页 > news >正文

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

摘要:

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 尾部插入:

相关文章:

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

摘要: 1,双链表的介绍 2,双链表的用途 3,双链表的节点插入和删除 1,双链表的介绍 前面我们讲过单链表,单链表的特点就是只能往后访问不能往前访问。单链表一般在面试中用的比较多,比如删除倒数第…...

我用 Midjourney 的这种风格治愈了强迫症

在 Midjourney 能够实现的各种布局之中,有两种风格因其简洁、有序而独居魅力,它们就是平铺 (Flat Lay) 和 Knolling (Knolling 就是 Knolling, 无法翻译🤣)。要在现实生活中实现这样的美学效果并不容易,你需要精心挑选各种小物件&…...

三维大场景管理-3Dtiles规范

简介 : 这篇文章都是三年前写的了,一直在笔记库存中,今天把他放出来。主要是讲Cesium 的3Dtiles 格式,当然3Dtiles主要是解决场景管理大场景的LOD实现的问题,不管是剔除渲染性能优化之Culling 剔除或者 LOD 、3Dtiles…...

Flutter 中的 FractionalTranslation 小部件:全面指南

Flutter 中的 FractionalTranslation 小部件:全面指南 在 Flutter 的丰富布局库中,FractionalTranslation 是一个允许你将子组件沿着一个轴或两个轴进行部分平移的动画小部件。这种类型的平移通常用于创建滑动效果,如卡片的滑动删除或滑动展…...

Thrift快速入门开发demo

Thrift快速入门开发demo 一、认识Thrift thrift是什么?一个RPC 代码生成框架,使用它的IDL(Interface Defination Language,接口定义语言)定义你想要实现的接口,然后它就会生成对应语言的远程调用框架代码,用户只需要实现接口逻辑,不用关心具体的细节。 tutorial:htt…...

关于C++智能指针复习总结

RAII(Resource Acquisition Is Initialization): 资源获得即初始化 利用对象生命周期来控制程序的资源(将资源交给对象处理) 智能指针利用了该思想 将资源交给一个对象, 初始化资源(可以是指针或者等等资源), 释放交给析构函数 因为析构函数无论是什么场景, 对象销毁时一定会…...

Prometheus Operator创建告警规则并接入钉钉报警

prometheus之钉钉报警 前言1. 添加prometheus报警规则1.2 添加自定义报警规则文件 2. 配置钉钉报警2.2 部署dingding插件 3. 编写alertmanager配置文件 前言 在kubenetes上安装了kube-promethues(包含Prometheus Operator),程序正常跑起来了&#xff0c…...

Word整理论文参考文献

1.安装Zotero软件 2.安装Zotero的Chrome网站插件,并将插件固定到浏览器 3.安装Word的Zotero插件 4.在DBLP网站https://dblp.org/search 搜索需要添加的参考文献->点击BibTex->点击网页右上角的Zotero符号(即第二步所指的符号)->至…...

计算机网路概述

目录 计算机网络的概念 计算机网络的定义: 计算机网络的组成: 终端系统/资源子网 通信子网 计算机网络的类型 按照拓扑分类​编辑 按照范国分类: 按传输方式进行分类 计算机网络体系结构 传输方式 按照传输方向区分 按照传输对象…...

832. 翻转图像 - 力扣

1. 题目 给定一个 n x n 的二进制矩阵 image ,先 水平 翻转图像,然后 反转 图像并返回 结果 。 水平翻转图片就是将图片的每一行都进行翻转,即逆序。 例如,水平翻转 [1,1,0] 的结果是 [0,1,1]。 反转图片的意思是图片中的 0 全部被…...

mumu 模拟器安装

1.下载安装 下载地址 Win 历史版本:http://mumu.163.com/update/win/Mac 历史 版本:http://mumu.163.com/20200515/25905_880858.html 2.设置为竖屏 在设置中心--界面设置页面设置宽720,高1280,DPI为240,如下图所示。…...

opencv实现图片的膨胀腐蚀

opencv实现图片的膨胀腐蚀 在OpenCV中,膨胀和腐蚀是两种基本的图像处理操作,通常用于二值图像中以提取特定的特征。它们是基于图像的形态学操作,使用一个称为结构元素或核的模板来改变图像的形状。 下面是如何使用OpenCV实现图片的膨胀和腐…...

[AIGC] Java常用的JSON库及简单示例

Java常用的JSON库及简单示例 在Java的世界里,JSON库广泛用于日常开发工作,本文将介绍几个常用的JSON库并配以简单的示例代码。 1. Gson Gson是Google提供的一个用来在Java对象和JSON数据之间进行转换的Java库。 它有一定的学习曲线,但一旦熟…...

Linux shell编程学习笔记50:who命令

0 前言 2024年的网络安全检查又开始了,对于使用基于Linux的国产电脑,我们可以编写一个脚本来收集系统的有关信息。比如,我们可以使用who命令来收集当前已登陆系统的用户信息,当前运行级别等信息。 1. who命令 的功能、格式和选项…...

vue使用webscoket

1. 创建 WebSocket 连接 首先,你需要在你的 Vue 组件中创建一个 WebSocket 连接。通常,这会在组件的 created 或 mounted 生命周期钩子中完成。 created() {this.socket new WebSocket(wss://your-websocket-url);this.socket.onopen () > {conso…...

第18章-综合以上功能 基于stm32的智能小车(远程控制、避障、循迹) 基于stm32f103c8t6/HAL库/CubeMX/超详细,包含代码讲解和原理图

这个是全网最详细的STM32项目教学视频。 第一篇在这里: 视频在这里 STM32智能小车V3-STM32入门教程-openmv与STM32循迹小车-stm32f103c8t6-电赛 嵌入式学习 PID控制算法 编码器电机 跟随 第18章-综合以上功能 18-按键和app按钮切换功能 根据上面介绍,我们的模式可…...

java并发工具类都有哪些

Java中的并发工具类包括: CountDownLatch CountDownLatch允许一个或多个线程等待其他线程完成某些操作。它通常用于线程间的同步,例如在一个线程完成其工作后通知其他线程继续执行。 CyclicBarrier CyclicBarrier是一个同步辅助类,它允许一…...

偏微分方程算法之抛物型方程差分格式编程示例一

目录 一、研究问题 二、C++代码 三、结果分析 一、研究问题 从本节开始将对具体的抛物型偏微分问题算例进行C++编程,以加深对抛物型偏微分方程差分格式构造的理解和应用。 采用向前欧拉格式计算抛物型方程初边值问题:...

数据结构—栈(C语言实现)

文章目录 前言一、栈的概念二、栈的代码实现Stack.hStack.c 三、使用栈解决有效的括号问题总结 前言 小伙伴们,大家好哇!!欢迎来到我的博客! 今天来分享一下另外一种数据结构—栈。主要包括栈的基本概念与其代码实现&#xff0c…...

JVM学习-垃圾回收器(一)

垃圾回收器 按线程数分类 串行垃圾回收器 串行回收是在同一时间段内只允许有一个CPU用于执行垃圾回收操作,此时工作线程被暂停,直至垃圾收集工作结束 在诸如单CPU处理器或者较小的应用内存等硬件平台不是特别优越的场合,串行回收器的性能表…...

飞书机器人接入OpenClaw指南:千问3.5-27B实现智能问答助手

飞书机器人接入OpenClaw指南:千问3.5-27B实现智能问答助手 1. 为什么选择OpenClaw飞书机器人组合 去年我接手了一个技术文档整理项目,每天需要处理上百份飞书文档的归类与摘要生成。手动操作不仅效率低下,还经常漏掉关键更新。直到发现Open…...

OpenFontRender:嵌入式MCU的轻量级TTF字体渲染库

1. OpenFontRender 库深度解析:面向嵌入式微控制器的 TTF 字体渲染引擎OpenFontRender 是一款专为资源受限微控制器设计的开源 TTF(TrueType Font)字体渲染库,其核心目标是在 Arduino IDE 生态下实现高质量、可定制、跨平台的矢量…...

串扰是怎么来的?相邻层走线方向比间距更重要

摘要:在高速PCB设计中,串扰是导致信号完整性问题的主要原因之一。许多工程师过于关注走线间距(3W规则),却忽视了相邻层走线方向的影响。本文将从物理机制出发,解释为什么相邻层走线方向正交(垂直…...

哪些降重软件可以同时降低查重率和AIGC疑似率?2026届TOP5硬核评测与选择建议

【CSDN 深度评测 / 突破算法封锁的毕业指南】 近期收到太多在读研究生的私信:“学长,我的论文查重率降到了8%,但教务处系统提示‘AIGC疑似率65%’,被打回重头再来,怎么办?” 在2026年的今天,知网…...

Elsevier投稿状态监控插件:3分钟告别手动刷新的终极解决方案

Elsevier投稿状态监控插件:3分钟告别手动刷新的终极解决方案 【免费下载链接】Elsevier-Tracker 项目地址: https://gitcode.com/gh_mirrors/el/Elsevier-Tracker 你是否每天都要反复登录Elsevier投稿系统,只为查看那迟迟不来的审稿状态&#xf…...

时间序列分类新范式:从技术突破到商业落地全指南

时间序列分类新范式:从技术突破到商业落地全指南 【免费下载链接】InceptionTime 项目地址: https://gitcode.com/gh_mirrors/in/InceptionTime 时间序列分类是数据分析领域的核心挑战,传统方法往往在多尺度特征捕捉、实时性分析和复杂场景适应性…...

AI大模型的简历如何写才能拿到面试机会?简历+项目+面试技巧+面试题一套全搞定!

AI大模型的简历如何写才能拿到面试机会?简历项目面试技巧面试题一套全搞定! 一、简历撰写:突出AI大模型核心能力 1. 技术栈明确标注 必写项: 框架:PyTorch、TensorFlow、Hugging Face Transformers、DeepSpeed、Lang…...

全电发票普及,智蜂AI智能代账助力合规与高效

票据管理时代已至智蜂AI代账破局增效人工智能自动化智蜂财税专注AI 人工智能代账服务,以智能系统高效处理票据、记账、报税,搭配专业会计师人工审核把关,为中小微企业提供安全、高效、合规的一站式财税解决方案,助力企业降本增效…...

联络中心支付软件市场最新数据披露:规模达41.37亿元,行业格局加速显现

在全球企业数字化转型浪潮汹涌以及客户对便捷支付体验需求日益增长的背景下,联络中心支付软件市场正迎来前所未有的发展机遇。据恒州诚思调研统计,2025年全球联络中心支付软件市场规模约41.37亿元,预计未来将持续保持平稳增长态势&#xff0c…...

第四天(实习无忧)

##文件结束的判定,编译与链接##1.文件结束的判定:fgetc(pf)读取结束返回EOF,fgets(arr,100,pf)读取结束返回NULL,fread(arr,sizeof(int),n,pf)读取结束返回对应的n。而成功读取到文件尾结束可以用feof(pf)判断,若中途因…...