数据结构:循环链表、双向链表和有序表

news2024/10/6 4:12:09

1、循环链表

循环链表(circular linked list)是线性表的另一种形式的链式存储表示。它的特点是表中最后一个结点的指针域指向第一个结点,整个链表成为一个由链指针相链接的环。对于循环链表,通常还在表中第一个结点之前“附加”一个“头结点”,并令“头指针”指向最后一个结点,以便头尾兼顾。头结点的结构和其他结点相同,一般情况下,无特殊需要头结点的数据域不存储任何信息。空表的循环链表由只含一个自成循环的头结点表示,如图 2.14所示。

在这里插入图片描述

循环链表的操作和单链表基本一致,差别仅在于算法中判别表尾的循环条件不是(顺链扫描的)指针 p 是否为 NULL,而是它是否等于头指针。循环链表可使某些操作简化。例如,将两个链表相接成一个表,需从一个链表的表尾链接到另一个链表的表头。若是单链表,为了找到其中一个链表的最后一个结点,必须从头指针起,顺链扫描,直至最后一个结点,其执行时间为 O(n)。而对循环链表作此操作时,由于它是个头尾相链接的环,两表相接仅需将一个表的表尾和另一个表的表首相接即可。如图 2.15 所示,完成这个操作仅需修改两个指针值即可,执行时间为 O(1)。

在这里插入图片描述

2、双向链表

以上讨论的链式存储结构的结点中只有一个指示直接后继的指针域 next。从任一结点出发,只能顺 next 指针往后寻查其他结点。若要寻查结点的前趋,则需从头指针出发.换句话说,在单链表中,求“后继”的执行时间为 O(1),而求“前驱”的执行时间为 O(n)。为克服单链表这种单向性的缺点,可利用双向链表(double linked list)。

顾名思义,在双向链表的结点中有两个指针域,其一指向“直接后继”,另一指向“直接前驱”,在 C 语言中可描述如下:

在这里插入图片描述
与单链表类似,双向链表也是由头指针唯一确定。增添头结点也能简化双向链表的某些操作,若将头尾结点链接起来则构成双向循环链表,如图 2.16 所示。空的双向循环链表由只含一个自成双环的头结点表示。

在这里插入图片描述
显然,在双向循环链表中进行插入或删除操作时,必须同时修改两个方向上的指针。然而,由于双向链表中每个结点都有一个指向前驱的指针,则在进行前插和删除操作时,算法中无需再用 while 语句找(插入或删除位置) p 的前驱。由此可见,结构的轻微变化有时也会影响算法的时间复杂度。算法 2.21 和算法 2.22 分别为在带头结点的双向循环链表中插入一个结点和删除一个结点的算法。图 2.17 和图 2.18 则分别显示执行这两个算法时指针修改的情况。

在这里插入图片描述
在这里插入图片描述
在本节中讨论的链表结构都按常规的做法,定义为一个指向链表中第一个结点或头结点的头指针。对于如此定义的链表结构,虽然也可以完成线性表的任何操作,但给某些“简单操作”带来不便。例如,求线性表的表长,在表中最后一个元素后面进行插入或者删除最后一个元素等,对顺序表进行这些操作的时间复杂度都是 O(1)常量级的,而对链表进行这些操作时,由于需要找到“尾结点”,致使它们的时间复杂度上升为 O(n)线性级。因此,在应用程序中,应将链表定义为包含“头指针”“尾指针”和“链表长度”3 个域的结构更为恰当,而且这些信息在链表生成的时候也就一并得到了。

3、有序表

若线性表中的数据元素相互之间可以比较,并且数据元素在线性表中依值非递减或非递增有序排列,即 ai>=ai-1或 ai<=ai-1(i=2,3,…,n),则称该线性表为有序表(ordered list)。有序表的基本操作和线性表大致相同,但由于有序表中的数据元素有序排列,因此在有序表中插入元素的操作应按“有序关系”进行。和线性表相同,有序表也可以有顺序表和链表两种存储表示方法

下列算法描述了在顺序有序表中插人一个数据元素的操作。已知有序表中数据元素依值递增排列,现要插入一个新的数据元素,则应该使插入之后的顺序表仍保持有序表的特性。由此在插入之前,首先应该通过查看比较找到元素 x 的插入位置,然后移动元素腾出空位并进行插入。假设已知有序表为(a1,a2, … ,an),则x的插入位置应该满足条件ai<=x<ai+1。
在这里插入图片描述
在这里插入图片描述
上述算法中的查找过程是从表尾向表头逆向进行的。显然,查找也可正向进行,即从表头向表尾扫描。算法的时间复杂度为 O(n),其中 n 为表长。

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

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

相关文章

【算法基础】基础算法之排序

&#x1f63d;PREFACE&#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐ 评论&#x1f4dd;&#x1f4e2;系列专栏&#xff1a;https://blog.csdn.net/weixin_59954106/category_12108349.html&#x1f4aa;种一棵树最好是十年前其次是现在目录 1.快排 步骤 思路方法 题目…

ABB机器人仿真软件robotstudio v6.08安装教程

ABB机器人仿真软件robotstudio v6.08安装教程 具体步骤可参考以下内容: 注意:安装之前,最好将电脑的名称改为英文,否则可能会安装不成功, 第1步:将下载的安装包解压缩, 第2步:找到解压后的文件中的RobotStudio6.08, 第3步:找到“setup.exe”, 第4步:软件正在…

Open3D 深度图像转点云数据(Python版本)

文章目录 一、简介二、代码实现三、实现效果测试数据参考文献一、简介 深度图像的获取有很多方式,如激光雷达、结构光以及深度相机等,网上很多教程都是在讲解通过深度相机所获取的深度图像转换为三维点云数据(相机内参、外参),但是通过激光雷达所生成的深度相机通常与相机…

数据分析-决策树

我们生活中遇到很多问题其实把他们抽象成一个数学模型&#xff0c;都可以抽象为一个决策树。&#xff08;比如打篮球&#xff09; 我们总是会经历两个阶段&#xff1a;构造、剪枝 构造 什么是构造呢&#xff1f;构造就是生成一棵完整的决策树。简单来说&#xff0c;构造的过程…

【MySQL基础】MySQL多表操作详解

序号系列文章4【MySQL基础】MySQL表的七大约束5【MySQL基础】字符集与校对集详解6【MySQL基础】MySQL单表操作详解7【MySQL基础】运算符及相关函数详解文章目录前言MySQL多表操作1&#xff0c;多表关系1.1&#xff0c;一对一1.2&#xff0c;一对多1.3&#xff0c;多对多2&#…

Prometheus 配置身份认证

Prometheus 版本 2.41.0 平台统一监控的介绍和调研直观感受PromQL及其数据类型PromQL之选择器和运算符PromQL之函数Prometheus 配置身份认证 Prometheus 使用默认方式安装是不带有身份证认证和TLS&#xff0c;需要单独配置开启。 Prometheus 配置文件为yaml格式&#xff0c;并…

【自然语言处理】文本表示(一):One-Hot、BOW、TF-IDF、N-Gram

文本表示&#xff08;一&#xff09;&#xff1a;One-Hot、BOW、TF-IDF、N-Gram1.One-Hot 编码 One-Hot 编码&#xff0c;又称 “独热编码”&#xff0c;是比较常用的文本特征提取方法。这种方法把每个词表示为一个很长的向量。这个向量的维度是词表大小&#xff0c;只有一个维…

4. 基础语法

1. 标识符 a. 第一个字符必须是字母表中字母或下划线 _&#xff1b; b. 标识符的其他的部分由字母、数字和下划线组成&#xff1b; c. 标识符对大小写敏感&#xff1b; 在 Python 3 中&#xff0c;可以用中文作为变量名&#xff0c;非 ASCII 标识符也是允许的&#xff1b; 2.…

【JavaGuide面试总结】计算机网络·中

【JavaGuide面试总结】计算机网络中1.说说断开连接 - TCP 四次挥手2.为什么要四次挥手&#xff1f;3.为什么不能把服务器发送的 ACK 和 FIN 合并起来&#xff0c;变成三次挥手&#xff1f;4.如果第二次挥手时服务器的 ACK 没有送达客户端&#xff0c;会怎样&#xff1f;5.为什么…

第五届字节跳动青训营 前端进阶学习笔记(五)CSS进阶

文章目录前言CSS的重要特性1.选择器特指度&#xff08;1&#xff09;选择器优先级&#xff08;2&#xff09;选择器特指度2.继承&#xff08;1&#xff09;默认继承&#xff08;2&#xff09;显式继承3.初始值4.CSS属性值的计算过程布局&#xff08;Layout&#xff09;1.布局相…

搜索?——P3956 [NOIP2017 普及组] 棋盘

传送门: [NOIP2017 普及组] 棋盘 - 洛谷 思路: 将棋盘的每一个格子看做一个点&#xff0c;建一个无向图用来跑最短路. 这道题本应用搜索来做&#xff0c;但是转换成最短路好像简单点 建图: 1.对于已经有颜色的格子&#xff0c;在扫描四个方向的格子对相同颜色的建条长度为0…

【目标检测】目标检测究竟发展到了什么程度?聊聊这22年!

目录&#xff1a;目标检测的发展历程一、引言二、背景三、目标检测发展脉络3.1 传统目标检测算法3.1.1 Viola Jones Detector3.1.2 HOG Detector3.1.3 DPM Detector3.1.4 局限性3.2 Anchor-Based中的Two-stage目标检测算法3.2.1 RCNN3.2.2 SPPNet3.2.3 Fast RCNN3.2.4 Faster R…

Allegro如何设置Net Group操作指导

Allegro如何设置Net Group操作指导 Allegro除了可以对一组网络设置Bus以外,同样支持创建Net Group,如下图 功能和Bus的功能类似,并且同一个Net Group里面的网络可以形成一个shape形式的Group,方便查看 具体创建方法操作如下 打开规则管理器选择Electrical

MySQL窗口函教-开窗聚合函数(SUM()、AVG()、MAX()、MIN()、COUNT())

MySQL窗口函教-开窗聚合函数&#xff08;SUM()、AVG()、MAX()、MIN()、COUNT()&#xff09;和传统的聚合函数区别&#xff1f;最大的区别在于&#xff0c;一个操作列&#xff0c;一个是依次操作行&#xff0c;最终显示出每一行&#xff0c;最后的效果就是呈现叠加的效果-- 开窗…

Windows环境下安装配置Mosquitto服务及入门操作介绍

文章目录一、概念梳理二、下载与安装三、关于配置文件的一些重要说明四、配置登录账号和密码参考&#xff1a; 博客一、概念梳理 Mosquitto是一款实现了消息推送协议MQTT 3.1的开源消息代理软件&#xff0c;提供轻量级的、支持可订阅/可发布的消息推送模式&#xff0c;是设备与…

mf10ccwm芯片说明部分译文

MF10-N是一种通用的双二阶状态变量滤波器&#xff0c;其中心频率与应用于时钟输入&#xff08;fCLK&#xff09;的方波的频率成正比。通过将引脚12连接到适当的直流电压&#xff0c;滤波器中心频率fO可以等于fCLK/100或fCLK/50。通过使用晶体时钟振荡器可以非常精确地设置&…

《深入浅出计算机组成原理》学习笔记 Day5

动态链接1. 静态链接与动态链接2. 地址无关3. PLT 和 GOT参考1. 静态链接与动态链接 静态链接&#xff08;Static Link&#xff09;是通过合并代码段的方法来使程序装载至内存&#xff1b; 动态链接&#xff08;Dynamic Link&#xff09;则是链接加载到内存中的共享库&#xf…

数据结构之栈与队列详解

文章目录前言一、栈1.栈的概念及定义2.栈的实现&#xff08;1&#xff09;栈的结构&#xff08;2&#xff09;StackInit&#xff08;初始化&#xff09;&#xff08;3&#xff09;StackPush&#xff08;压栈&#xff09;&#xff08;4&#xff09;StackPop&#xff08;出栈&…

与众不同的异域年夜饭体验,你最中意哪一款?

年夜饭&#xff0c;中国人一年中最重要的一顿团圆聚餐&#xff0c;不仅丰富多彩&#xff0c;还充满了各种吉祥寓意。如果你选择的是出境旅游过春节&#xff0c;那么一次异域年夜饭体验也可以让你的旅行充满乐趣&#xff0c;收获与众不同的别样回忆。今天就跟着小旅城去看看&…

1597_AURIX_TC275_GPIO简介

全部学习汇总&#xff1a; GreyZhang/g_TC275: happy hacking for TC275! (github.com) 左上角画出来的这个寄存器可以进行输入输出的控制。从右边上下拉设备这里可以看得出来&#xff0c;输入输出其实都是可以配置的。当端口配置为输入的时候&#xff0c;逻辑图中的输出驱动会…