【数据结构】链表的八种形态

🦄个人主页:修修修也

🎏所属专栏:数据结构

⚙️操作环境:Visual Studio 2022


目录

链表的三大"性状"

一.带头链表和不带头链表

头指针与头结点的异同

    头指针

    头结点

二.循环链表和非循环链表

三.双向链表和单向链表

链表的八大形态

结语


链表的三大"性状"

要搞清楚为什么链表八大形态,就要先搞清楚链表的三大"性状".

说起"性状"这个词,大家是不是首先都会想到孟德尔的豌豆杂交实验:

你可能会疑惑,难道链表也像豌豆一样有相对性状吗?

我要告诉你,是的.而且链表的相对性状也和豌豆的相对性状一样可以"杂交".


在"杂交"出链表的八大形态之前,我们先来了解链表的三种相对性状:

一.带头链表和不带头链表

有时,我们为了更加方便地对链表进行操作,会在单链表的第一个结点前附设一个结点,称为头结点.

头结点的数据域可以不存储任何信息,也可以存储如线性表的长度等附加信息,头结点的指针域存储指向第一个结点的指针,如下图所示:


头指针与头结点的异同

    头指针

  • 头指针是指链表指向第一个结点的指针,若链表有头结点,则是指向头结点的指针.
  • 头指针具有标识作用,所以常用头指针冠以链表的名字.
  • 无论链表是否为空,头指针均不为空.头指针是链表的必要元素.

 无头结点单链表示意图:

 无头结点空单链表示意图:

头结点

  • 头结点是为了操作的统一和方便而设立的,放在第一元素的结点之前,其数据域一般无意义(也可存放链表的长度).
  • 有了头结点,对在第一元素结点前插入结点和删除第一结点,其操作与其他结点的操作就统一了.
  • 头结点不一定是链表必须要素.

带头结点单链表示意图:

带头结点空单链表示意图:


二.循环链表和非循环链表

对于单链表,由于每个结点只存储了向后的指针,到了尾标志就停止了向后链的操作,这样,当中某一结点就无法找到它的前驱结点了.

举个例子,下面是北京的地铁线路图:

我们拿一号线举个例子,假设我想乘坐地铁一号线从双桥地铁站到天安门东地铁站去,那么我在双桥站登上地铁后,坐上一号线朝向苹果园的地铁就出发了.

但是因为我在地铁上玩着手机忽略了时间,等想起来才发现自己乘坐的这趟地铁已经行驶到复兴门了,那么我还能继续乘坐这趟地铁到达天安门东吗?显然是不能的.

其实这里一号线驶向苹果园的一趟地铁就有些类似于我们的单链表的结构,每个结点只能向后走,错过了就不能再回去.

但事实上,如果我们将地铁的尾站和首站连接起来,就能解决我们前面所面临的困难,如地铁10号线:

我们可以看到,地铁10号线的设计就是将整条地铁线路首尾相连,这样一趟地铁就可以在线路上一直循环,即使我乘坐10号线时错过了国贸站,但只要我有足够的恒心和毅力,等这班地铁再绕完一整圈的历程我就又可以回到国贸站.

这种将单链表中终端结点的指针端空指针改为指向头结点,就使整个单链表形成一个环,这种头尾相接的单链表称为单循环链表,简称循环链表(circular linked list).

循环链表解决了一个很麻烦的问题:如何从当中一个结点出发,访问到链表的全部结点.

循环链表带有头结点的空链表示意图:

循环链表带有头结点的非空链表示意图:

循环链表和单链表的主要差异就在于循环遍历时的判断条件上,原来是判断p->next是否为NULL,现在则是p->next不等于头结点,则循环遍历未结束.


三.双向链表和单向链表

我们在单链表中,有了next指针,我们要查找下一个结点的时间复杂度为O(1).

可是如果我们要查找的是上一个结点的话,那最坏的时间复杂度就是O(n)了,因为我们每次都要从头开始遍历查找结点.

为了克服单向性这一缺点,我们的前辈们设计出了双向链表.

双向链表(double linked list)是在单链表的每个结点中,再设置一个指向其前驱结点的指针域.

所以在双向链表中的结点都有两个指针域,一个指向直接后继,另一个指向直接前驱.

双向链表结点结构示意图:

双向循环带有头结点的空链表示意图:

双向循环带有头结点的非空链表示意图:

对于双向链表中的某一个结点p,它后继的前驱还是它自己,即:

p->next->prev=p=p->prev->next

链表的八大形态

通过上面对链表性状的了解,我们知道了链表共有三种性状,如下:

  • 有头结点/无头结点
  • 非循环链表/循环链表
  • 单向链表/双向链表

将链表的三种性状简单排列组合后我们就可以得到链表的八种形态了,分别是:

  • 无头结点非循环单向链表
  • 无头结点非循环双向链表
  • 无头结点循环单向链表
  • 无头结点循环双向链表
  • 有头结点非循环单向链表
  • 有头结点非循环双向链表
  • 有头结点循环单向链表
  • 有头结点循环双向链表

在以上8种链表的形态中我们最常用的无头结点非循环单向链表有头结点循环双向链表这两种链表结构,这两种链表的特性为:

  • 无头单向非循环链表:结构简单,一般不会单独用来存数据。实际中更多是作为其他数据结构的子结构,如哈希桶、图的邻接表等等。并且这种结构在笔试面试中出现很多。
  • 带头双向循环链表:结构最复杂,一般用在单独存储数据。实际中使用的链表数据结构,都是带头双向循环链表。

因为这两种链表真的非常重要,所以我们必须对这两种链表的实现要十分熟悉,有关这两种链表的C语言实现详解我放在下面了,感兴趣的朋友可以直接点击链接跳转到相应文章参阅:

【数据结构】C语言实现单链表万字详解(附完整运行代码)icon-default.png?t=N7T8https://blog.csdn.net/weixin_72357342/article/details/133971550?spm=1001.2014.3001.5502

【数据结构】C语言实现带头双向循环链表详解(附完整运行代码)icon-default.png?t=N7T8https://blog.csdn.net/weixin_72357342/article/details/134513792


结语

希望通过上面的内容能对大家有所帮助,欢迎大佬们留言或私信与我交流.学海漫浩浩,我亦苦作舟!关注我,大家一起学习,一起进步!

相关文章推荐

【数据结构】什么是数据结构?

【数据结构】什么是算法?

【数据结构】什么是线性表?

【数据结构】线性表的顺序存储结构

【数据结构】线性表的链式存储结构

【数据结构】C语言实现顺序表万字详解(附完整运行代码)

【数据结构】10道经典面试题目带你玩转链表

【实用编程技巧】不想改bug?初学者必须学会使用的报错函数assert!(断言函数详解)



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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

键盘快捷键工具Keyboard Maestro mac中文版介绍

Keyboard Maestro mac是一款键盘快捷键工具,它可以帮助用户通过自定义快捷键来快速完成各种操作,提高工作效率。Keyboard Maestro支持多种快捷键组合,包括单键、双键、三键、四键组合等,用户可以根据自己的习惯进行设置。此外&…

测试工程师一定要会的Jmeter_性能测试教程:性能测试脚本的优化

性能测试脚本的优化 以PHP论坛为例:http://47.107.178.45/phpwind/ 根据上一篇的性能测试(3)的脚本进行优化;见下图: 如上图中,把发帖和回帖的事务添加到随机控制器中,登录操作添加到仅一次控制器中&…

修改el-radio-group样式,自定义单选组件

修改el-radio-group样式,自定义单选组件 自定义组件 MyRadioGroup.vue <template><div class"btnsBox"><el-radio-group v-model"activeIndex" change"handleClick"><el-radio-buttonv-for"(item, index) in list&qu…

万户OA upload任意文件上传漏洞复现

0x01 产品简介 万户OA ezoffice是万户网络协同办公产品多年来一直将主要精力致力于中高端市场的一款OA协同办公软件产品&#xff0c;统一的基础管理平台&#xff0c;实现用户数据统一管理、权限统一分配、身份统一认证。统一规划门户网站群和协同办公平台&#xff0c;将外网信息…

vite vue3配置axios

准备 参考 安装axios yarn add axiossrc下新建request文件夹&#xff0c;该文件下新建index.ts import axios from axios; import { ElMessage } from element-plus;// const errorCodeType function (code: number): string { // let errMessage: string 未知错误; // …

SqlServer_idea连接问题

问题描述&#xff1a; sqlServer安装之后可以使用navicat进行连接idea使用账户密码进行登录连接失败 问题解决&#xff1a; 先使用sqlServer管理工具进行登录 使用window认证连接修改账户密码 启用该登录名 这时idea还是无法连接&#xff0c;还需要如下配置 打开sqlserve…

SVG直线 <line>与折线 <polyline>代码示例

本专栏是汇集了一些HTML常常被遗忘的知识&#xff0c;这里算是温故而知新&#xff0c;往往这些零碎的知识点&#xff0c;在你开发中能起到炸惊效果。我们每个人都没有过目不忘&#xff0c;过久不忘的本事&#xff0c;就让这一点点知识慢慢渗透你的脑海。 本专栏的风格是力求简洁…

LR学习笔记——图片管理分类

文章目录 图片标记图片筛选图片分类 图片标记 可以看到上面的第二排&#xff0c;每个图片都有不同的标记&#xff0c;前5张用星级进行标记&#xff0c;后三张用颜色进行标记 可以直接在图片下方点击几星级即可进行标记&#xff0c;也可以使用键盘上的数字键1-5进行打星 相对的&…

AnyTXT Searcher:本地文件内容搜索神器如何搭建与远程访问

文章目录 前言1. AnyTXT Searcher1.1 下载安装AnyTXT Searcher 2. 下载安装注册cpolar3. AnyTXT Searcher设置和操作3.1 AnyTXT结合cpolar—公网访问搜索神器3.2 公网访问测试 4. 固定连接公网地址 前言 你是否遇到过这种情况&#xff0c;异地办公或者不在公司&#xff0c;想找…

洛谷 P4568 [JLOI2011] 飞行路线 pytho解析

P4568 [JLOI2011] 飞行路线 pytho解析 时间&#xff1a;2023.11.20 题目地址&#xff1a;[JLOI2011] 飞行路线 题目分析 对于这个题呢就是最短路的问题了。那就可以用Dijkstra 算法&#xff0c;唯一不同的地方就是有免费的机票次数&#xff0c;那我们就先不考虑这个&#xf…

Linux vi和vim编辑器、快捷键的使用

Linux vi和vim编辑器、快捷键的使用 vi和vim的三种模式使用vim编写Hello.java文件vim快捷键和命令 在Linux下一般使用vi编辑器来编辑文件&#xff0c;vim是它的增强版。vim用于在远程环境下用命令形式对文本进行在线编辑&#xff0c;既可以查看文件也可以编辑文件。 vi是Linux系…

LINUX入门篇【7】--git提交指令以及代码调试工具gdb

前言&#xff1a; 我们今天来介绍一下我们工具篇的最后两个工具&#xff0c;即git提交指令以及代码调试工具gdb,再结合前面的知识点&#xff0c;我们就可以基本完成我们VS上的基本的功能&#xff1a;编写&#xff0c;调试&#xff0c;编译&#xff0c;执行程序的这些过程。 1…

leetcode:反转链表

题目描述 题目链接&#xff1a;206. 反转链表 - 力扣&#xff08;LeetCode&#xff09; 分析题目 思路一 我们可以设计算法让整个链表掉头 定义三个代码n1,n2,n3 n1指向NULL&#xff0c;n2指向head&#xff0c;n3指向第二个结点 当n2不为NULL的时候&#xff0c;让n2->ne…

ResizeObserver观察元素宽度的变化

ResizeObserver观察元素宽度的变化 ResizeObserver观察元素宽度的变化 ResizeObserver观察元素宽度的变化 ResizeObserver 构造函数创建一个新的 ResizeObserver 对象&#xff0c;它可以用于监听 Element 内容盒或边框盒或者 SVGElement 边界尺寸的大小。查看详细说明 案例 &l…

电影:从微缩模型到AI纹理

在线工具推荐&#xff1a; 三维数字孪生场景工具 - GLTF/GLB在线编辑器 - Three.js AI自动纹理化开发 - YOLO 虚幻合成数据生成器 - 3D模型在线转换 - 3D模型预览图生成服务 自胶片问世以来&#xff0c;电影制作人必须以模仿现实的方式使用纹理&#xff0c;让观众相信他…

Semi-Supervised Multi-Modal Learning with Balanced Spectral Decomposition

Y是所有模态的表征矩阵&#xff0c; ∑ i 1 d h ( λ i ) \sum_{i1}^dh(\lambda_i) ∑i1d​h(λi​) is the proposed eigenvalue-based objective function,the final similarity matrix W for the multimodal data as a block matrix 辅助信息 作者未提供代码

研究前沿| Nature:艰难梭菌引发肠道神经源性炎症的新机制

前言 艰难梭菌感染&#xff08;Clostridioides difficile infection&#xff09;是目前发达国家医院和社区内获得性肠道细菌感染腹泻的最主要原因之一。在美国&#xff0c;每年有约50万例病例和导致约29,000例死亡。艰难梭菌&#xff08;C. difficile&#xff09;是一种产生孢子…

力扣C++学习笔记——C++ 给vector去重

要使用std::set对std::vector进行去重操作&#xff0c;您可以将向量中的元素插入到集合中&#xff0c;因为std::set会自动去除重复元素。然后&#xff0c;您可以将集合中的元素重新存回向量中。以下是一个示例代码&#xff0c;演示如何使用std::set对std::vector进行去重&#…

Android Studio 安装及使用

&#x1f353; 简介&#xff1a;java系列技术分享(&#x1f449;持续更新中…&#x1f525;) &#x1f353; 初衷:一起学习、一起进步、坚持不懈 &#x1f353; 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正&#x1f64f; &#x1f353; 希望这篇文章对你有所帮助,欢…

IP地址的分包与组包:网络通信的关键技术解析

在计算机网络中&#xff0c;IP地址的分包与组包是网络通信过程中关键的技术环节&#xff0c;分别涉及将数据拆分为适当大小的包以及在接收端重新组装这些包的过程。这两个过程对于确保高效、可靠的数据传输至关重要。以下将深入探讨IP地址的分包与组包的概念、原理以及在网络通…