双链表(上)

1.结构

1.带头双向循环链表

注意:这里的“带头”跟前面我们说的“头节点”是两个概念,实际前面的在单链表阶段称呼不严
谨,但是为了同学们更好的理解就直接称为单链表的头节点。
带头链表里的头节点,实际为“哨兵位”,哨兵位节点不存储任何有效元素,只是站在这里“放哨
的”。


“哨兵位”存在的意义:遍历循环链表避免死循环。在这里需要知道的我们在学习单链表的时候学的是没有带头的,只是将第一个节点作为头结点而已,带头的是表示一个不保存数据节点作为第一个节点。

2.双链表的实现

在这里应该有些小伙伴猜到了,我们在在之前学习的顺序表,单链表都是结构体声明,当然双链表也是的。

我们来看看是怎么实现的吧?

typedef int LTDataType;
typedef struct ListNode
{
struct ListNode* next; //指针保存下⼀个节点的地址
struct ListNode* prev; //指针保存前⼀个节点的地址
LTDataType data;
}LTNode;

我们发现双链表的声明比单链表多了一个东西,一个节点即保存下一个节点的地址又保存上一个节点的地址,当然头结点除外。

当然实现双链表也需要实现一些函数,我们先来看看需要实现的函数,下一篇将展示函数的实现。

在这之前大家可以先研究研究,动手试试看。

LTNode* LTInit();
void LTDestroy(LTNode* phead);
void LTPrint(LTNode* phead);
bool LTEmpty(LTNode* phead);
void LTPushBack(LTNode* phead, LTDataType x);
void LTPopBack(LTNode* phead);
void LTPushFront(LTNode* phead, LTDataType x);
void LTPopFront(LTNode* phead);
//在pos位置之后插⼊数据
void LTInsert(LTNode* pos, LTDataType x);
void LTErase(LTNode* pos);
LTNode *LTFind(LTNode* phead,LTDataType x);

3. 顺序表和双向链表的优缺点分析

不同点顺序表链表(单链表)
存储空间上物理上一定连续逻辑上连续,但物理上不一定连续
随机访问支持O(1)不⽀持:O(N)
任意位置插入或者删除元素可能需要搬移元素,效率低O(N)只需修改指针指向
插入动态顺序表,空间不够时需要扩容
 
没有容量的概念
应用场景元素高效存储+频繁访问任意位置插入和删除频繁
谢谢

 

 

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

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

相关文章

大模型在语音识别领域的最新进展与挑战

摘要: 本文概述了大模型在语音识别领域的最新进展与挑战,包括基础知识、核心组件、实现步骤、代码示例、技巧与实践、性能优化与测试、常见问题与解答、结论与展望等内容。 引言 语音识别技术的发展历程中,大模型的应用和重要性日益凸显。…

OMP实现MATLAB压缩感知实例

OMP(Orthogonal Matching Pursuit,正交匹配追踪)算法是一种用于稀疏信号重构的迭代算法。它的基本思想是在每一步选择与当前残差最相关的原子(或基),并使用它来更新估计值,直到满足停止准则为止。 基本流程 下面是OMP算法的基本流程: 初始化: 将残差初始化为原始信号…

【ARM】MDK在programming algorithm界面添加FLM

【更多软件使用问题请点击亿道电子官方网站查询】 1、 文档目标 解决在programming algorithm界面中无法添加想要的Flash编程算法的问题 2、 问题场景 在对于Debug进行Flash Download进行配置的时候,在programming algorithm界面中有对应的Flash编程算法。可以通过…

数据结构 之 树

目录 1. 定义: 2. 概念(重要): 3. 树的表示形式: 4. 树的应用: 1. 定义: 树是一种非线性的数据结构,,它是由n(n>0)个有限结点组成一个具有…

LeetCode——贪心算法(Java)

贪心算法 简介[简单] 455. 分发饼干[中等] 376. 摆动序列[中等] 53. 最大子数组和[中等] 122. 买卖股票的最佳时机 II[中等] 55. 跳跃游戏 简介 记录一下自己刷题的历程以及代码。写题过程中参考了 代码随想录的刷题路线。会附上一些个人的思路,如果有错误&#xf…

动态导入图片

起因&#xff1a;动态图片会自动拼接根路径&#xff0c;为了方便图片要放在public下解决&#xff1a;使用require引入图片资源注意&#xff1a;不能动态路径中使用require&#xff0c;如<img :src"require(…/assets/${item.imgUrl})" alt"" />{{ it…

MFC中内存共享调用方法及使用示例

在MFC&#xff08;Microsoft Foundation Classes&#xff09;中&#xff0c;内存共享是一种实现进程间通信的有效方法。以下是MFC中内存共享的调用方法以及一个基本的使用示例&#xff1a; 调用方法&#xff1a; 创建文件映射对象&#xff1a;使用CreateFileMapping函数创建一…

在 debian 虚拟机里如何设置 iso 文件为本地安装源

文章目录 在debian虚拟机里如何设置iso文件为本地安装源 <2023-07-10 周一> 在debian虚拟机里如何设置iso文件为本地安装源 这里有个坑&#xff0c;首先必须要先将iso文件加载好&#xff08;如何运行apt-cdrom后提示加载并按回车的话&#xff0c;后面可能出设置失败&am…

ARM 汇编指令:(三)运算处理指令

目录 一.add指令 二.sub指令 三.MUL指令 一.add指令 add用于执行实现两个寄存器或寄存机或寄存器与立即数的相加操作。它可以用于整数、浮点数等各种数据类型的加法运算。 ADD{cond}{S} Rd,操作数,操作数 1.不带进位加法指令add add r1, r2, #4 //r1 r2 4 add r1, r2 …

解决JVM进程被系统杀掉问题

背景 服务A在测试环境&#xff0c;隔几个小时接口就无法访问。登录机器查看&#xff0c;发现进程已经没了。大致猜想是进程使用的内存或CPU资源使用太多&#xff0c;导致被系统kill。 问题定位 使用dmesg命令查看进程被kill的详情。 > dmesg --time-format iso2024-03-0…

cv2.cvtColor()将二维转化为彩色图像

我们如果要将一维的图像转化为三维的彩色图像 import cv2 img cv2.cvtColor(img.squeeze(0), cv2.COLOR_GRAY2BGR) 这里的img.squeeze为二维数据&#xff0c;img为三维数据&#xff0c;所以压缩掉一个维度 。这样就将图像转化为了三维彩色图像。 cv2.imshow(Image, img) c…

EasyCode 插件的具体使用

前言 EasyCode 是基于IntelliJ IDEA Ultimate版开发的一个代码生成插件&#xff0c;主要通过自定义模板&#xff08;基于velocity&#xff09;来生成各种你想要的代码。通常用于生成Entity、Dao、Service、Controller。如果你动手能力强还可以用于生成HTML、JS、PHP等代码。理…

iOS 判断触摸位置是否在图片的透明区域

装扮功能系列&#xff1a; Swift 使用UIScrollerView 实现装扮功能&#xff08;基础&#xff09;Swift 使用UIScrollerView 实现装扮功能&#xff08;拓展&#xff09;iOS 判断触摸位置是否在图片的透明区域 背景 在装扮功能中&#xff0c;一般都是长按使道具进入编辑状态&…

AI与法律:大模型在法律文书生成中的应用与前景

AI与法律&#xff1a;大模型在法律文书生成中的应用与前景 测试&#xff1a; 评估指标&#xff1a;使用BLEU、ROUGE等指标评估生成质量。 模型压缩&#xff1a;通过剪枝、量化等方法减小模型大小。 模型部署&#xff1a;将模型部署到服务器或移动端&#xff0c;实现实时生成…

Docker拉取镜像存储不足

在使用Docker时&#xff0c;我们经常遇到一个问题&#xff0c;就是拉取镜像时提示存储空间不足。这是因为Docker在拉取镜像时需要将镜像文件下载到本地存储中&#xff0c;而有时本地存储空间不足以容纳完整的镜像文件。 本文将介绍一些解决这个问题的方法&#xff0c;并提供相…

Java学习笔记(11)

面向对象进阶 Static 静态变量 所有对象一起共享&#xff0c;就用static修饰 不属于对象&#xff0c;属于类的 可以用 类名.静态变量 “”&#xff1b;赋值 但是 对象.静态变量也可以访问到内容 Static内存图 Student这个类的字节码文件加载到方法区&#xff0c;并在内…

HTTP/1.1和HTTP/2的区别

HTTP/1.1和HTTP/2是两个不同的版本的超文本传输协议&#xff08;HTTP&#xff09;&#xff0c;用于在客户端和服务器之间传输信息。下面是它们之间的一些主要区别&#xff1a; 请求-响应的方式&#xff1a; HTTP/1.1: 在HTTP/1.1中&#xff0c;每个请求都需要单独的建立和维护…

什么是池架构?

池架构是一个微服务架构的潜在竞争者&#xff0c;在面向未来的可扩展性的竞争中挑战微服务的主导地位。 本文深入研究池架构的核心功能&#xff0c;将其与微服务进行比较&#xff0c;并探讨其彻底改变我们构建可扩展应用程序方式的潜力。我们将揭示与池架构相关的已公开的优势…

“人工智能+”成国策,天翼云如何打造大模型时代的驱动力样板?

文 | 智能相对论 作者 | 叶远风 两会政府工作报告中明确指出要制定支持数字经济高质量发展政策&#xff0c;开展“人工智能”行动&#xff0c;这意味着&#xff0c;“人工智能”已经成为国策。 在这种大背景下&#xff0c;大模型的重要性无疑被抬到了新的高度。 此时&#…

一文了解前端面试重点--闭包

1、什么是闭包&#xff1f; 闭包是指有权访问另一个函数作用域中的变量的函数&#xff0c;创建闭包的最常见的方式就是在一个函数内创建另一个函数。 温馨提示&#xff1a;由于闭包所在的作用域返回的局部变量不会被销毁&#xff0c;所以会占用内存。过度的使用闭包会迫使性能…