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

news2024/11/11 16:15:32

🦄个人主页:修修修也

🎏所属专栏:数据结构

⚙️操作环境: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!(断言函数详解)



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

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

相关文章

Amlogic方案遥控器配置(Android11)

配置路线 键值变化路径: ScanCode --> Keycode Lable --> KeyCode Layout --> KeyLable --> Keycode – > KeyEvent 文件映射路径: *.dtsi --> input-event-codes.h --> *.kl --> InputEventLable.h --> kecodes.h --> P…

laravel引入element-ui后,blade模板中使用elementui时,事件未生效问题(下载element-ui到本地直接引入项目)

背景 重构公司后台项目,使用了dcat-admin,但是dcat-admin有些前端功能不能满足需求。因此引入element-ui进行相关界面的优化 具体流程 1.下载element-ui到本地 2.进入如下目录 打开 node_modules\element-ui\lib 复制index.js 打开 node_modules/ele…

UE4基础篇十五:AI行为树

一、学习完教程后需要掌握知识点 1.1、基础概念: 1.1 行为树:控制并显示AI的决策制定过程 1.2 黑板:可以看做是行为树的创建一些公有变量,外部可以修改行为树黑板的变量值,达到修改行为树状态的逻辑 1.3 环境查询: 获取地图环境中的信息进行一个筛选,查找到所需要的的…

微信公众号上怎么做微信助力活动

微信公众号微信助力活动:一起分享,一起成长 在当今社交媒体时代,人们之间的互动和分享变得越来越重要。微信公众号作为一个广受欢迎的社交平台,为人们提供了一个便捷的分享和交流渠道。而微信助力活动则是通过分享和互动&#xf…

【算法萌新闯力扣】:两句话中的不常见单词

力扣热题:两句话中的不常见单词 开篇 今天是备战蓝桥杯的第19天,今天到目前刷了4道力扣算法题。其中,这道题是对我来说收获最大的一道,让我更熟练地掌握了一些算法题中方法,于是来与大家分享一下。 题目链接: 884.两…

听说90%的人都没搞定手撕协程池这道面试题!

特别的缘分 听说90%的人都没搞定手撕协程池这道面试题! 能看到这篇文章一定是特殊的缘分,请务必珍惜,请详细看看吧,哈哈。 不止上图,最近 Go就业训练营 中不少小伙伴说,面试中碰到了好几次手撕协程池的问题…

向上转型 向下转型 重写 多态 ---java

目录 一. 向上转型 1.1 概念 1.2 语法格式 1.3 动态绑定引入 1.4 重写的引入 1.5向上转型的使用方式 方式一: 直接赋值 方式二: 通过传参,进行向上转型(多态引入) 方法三:通过返回值, 进行向上转型 二. 重写 2.1 概念 2.2 重写的格式 2.3 重写的规则 【重写和重…

QT mysql 数据库线程池 与数据库操作封装

最近事情比较多很久没有写学习笔记了,数据库线程池, 数据库封装,虽说数据库操作有很多不需要写sql 的,ORM 封装的方式去操作数据库。但是从业这些年一直是自己动手写sql ,还是改不了这个习惯。不说了直接上代码。 数据…

YOLOv5 环境搭建

YOLOv5 环境搭建 flyfish 环境 Ubuntu20.04 驱动、CUDA Toolkit、cuDNN、PyTorch版本对应 1 NVIDIA驱动安装 在[附加驱动界]面安装驱动时,需要输入安全密码,需要记下,后面还需要输入这个密码 重启之后有的机器会出现 perform mok manage…

【Java开发】 Springboot集成Mybatis-Flex

1 Mybatis-Flex 介绍 1.1简介 Mybatis-Flex 是一个优雅的 Mybatis 增强框架,它非常轻量、同时拥有极高的性能与灵活性。我们可以轻松的使用 Mybaits-Flex 链接任何数据库,其内置的 QueryWrapper 亮点帮助我们极大的减少了 SQL 编写的工作的同时&#xff…

微信订房功能怎么做_公众号里怎么实现在线订房系统

微信公众号在线订房系统:一键解决您的住宿问题 在当今数字化时代,微信公众号已经成为人们生活中不可或缺的一部分。它提供了各种各样的功能和服务,让我们的生活变得更加便捷和高效。而如今,微信公众号也实现了在线订房功能&#…

SecureCRT -- 使用说明

【概念解释】什么是SSH? SSH的英文全称是Secure Shell 传统的网络服务程序,如:ftp和telnet在本质上都是不安全的,因为它们在网络上用明文传送口令和数据,别有用心的人非常容易就可以截获这些口令和数据。而通过使用SS…

8年老鸟整理,自动化测试-准备测试数据详细...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 大部分类型的测试…

拆解现货黄金隔夜利息计算公式

在讨论现货黄金投资手续费的时候,隔夜利息是经常被忽略的一个方面,但它是投资者不得不考虑的成本因素,特别是在中长线交易的情况下。隔夜利息是根据投资者的持仓数量和交易方向所计算出的利息,如果投资者需要持仓过夜,…

程序员的护城河:技术深度、创新追求与软实力的综合构筑

在IT行业,程序员被形象地比喻为现代社会的护城河,他们以代码为武器,捍卫着系统安全、数据防护以及网络稳定。然而,这位"护城河"究竟是依赖于技术深度、创新追求,还是软实力中的沟通协作等方面呢?…

【vue】ant-design-vue的树结构实现节点增删改查

根据业务需要,实现树结构的节点新增编辑删除功能,主要逻辑是利用树节点的scopedSlots属性对其进行自定义改造,监听悬停事件在节点右侧出现增删改对应图标,点击图标出现弹窗表单对内容进行修改,具体代码如下&#xff1a…

TikTok Shop订单狂涨,黑五全托管品类日卖爆了

01 黑五品类日爆单 显然,TikTok Shop在美国的首个黑五大促收获了胜利的果实。 根据最新发布的数据,TikTok Shop全托管黑五六大品类日支付GMV(总交易额)和支付量双双实现大幅度增长。举其中几个具体数据来看,女装童鞋…

【腾讯云云上实验室-向量数据库】腾讯云开创新时代,发布全新向量数据库Tencent Cloud VectorDB

前言 随着人工智能、数据挖掘等技术的飞速发展,海量数据的存储和分析越来越成为重要的研究方向。在海量数据中找到具有相似性或相关性的数据对于实现精准推荐、搜索等应用至关重要。传统关系型数据库存在一些缺陷,例如存储效率低、查询耗时长等问题&…

服务案例|故障频发的一周,居然睡得更香!

医院运维有多忙? 医院运维,听起来平平无奇毫不惊艳,但其中的含金量,可不是“维持系统正常运行”就能总结的。毕竟医院对业务连续性的超高要求,让运维面对的问题都是暂时的,下一秒可能就有新问题需要发现解…

CountDownLatch和CyclicBarrier

JUC(Java.util.concurrent)是Java 5中引入的一个并发编程库,它包含了许多用于多线程处理的工具类和接口。JUC主要提供了以下特性: 线程池:线程池可以提高线程的使用效率,避免频繁地创建和销毁线程&#xff…