学习数据结构第5天(线性表的链式表示)

news2024/11/17 21:33:15

线性表的链式表示

  • 单链表的定义
  • 单链表的基本操作
  • 双链表
  • 双链表的基本操作
  • 循环链表
  • 块状链表
  • 存储结构
  • 顺序表和链表的比较

线性表的顺序存储结构的特点是逻辑关系上相邻的两个数据元素在物理位置上也是相邻的。我们会发现虽然顺序表的查询很快,时间复杂度为 O ( 1 ) O(1) O(1),但是增删的效率是比较低的,因为每一次增删操作都伴随着大量的数据元素移动。为了解决这个问题我们可以使用另外一种存储结构实现线性表,链式存储结构

链式存储线性表时,不需要使用地址连续的存储单元,即不要求逻辑上相邻的元素在物理位置上也相邻,它通过 “链” 建立起数据元素之间的逻辑关系,因此插入和删除操作不需要移动元素,而只需修改指针,但也会失去顺序表可随机存储的优点。

单链表的定义

线性表的链式存储结构(也称之为链表)的特点是逻辑关系上相邻的两个数据元素在物理位置上不一定是相邻的,换言之数据元素在存储器中的位置可以是任意的。为了表示每个数据元素 a i a_i ai与其直接后继 a i + 1 a_i+1 ai+1之间的逻辑关系,对于数据元素 a i a_i ai来说,除了存储其本身的信息外,还需存储一个能够保存直接后继的存储位置的指针,这两部分信息组成数据元素 a i a_i ai的存储映像,我们称之为结点(node)。

结点包含两个或者三个域

  • 存储数据元素信息的域叫做数据域
  • 存储直接后继存储位置的域叫做指针域
  • 存储直接前继存储位置的域也叫指针域

如果只有一个指针域保存直接后继存储位置,这样的链表我们称之为单链表

在这里插入图片描述
利用单链表可以解决顺序表需要大量连续存储单元的缺点,但单链表附加指针域,也存在浪费存储空间的缺点。由于单链表的元素离散地分布在存储空间中,所以单链表是非随机存储的存储结构,即不能直接找到某个特定的节点。查找某个特定的结点时,需要从头开始遍历,依次查找。

为了方便对链表进行插入结点和删除结点的操作,我们在链表中的第一个结点之前加一个不存储实际的数据元素的结点,该结点我们称之为:头结点

头节点的指针域指向线性表的第一个元素结点:

在这里插入图片描述

在对单向链表进行访问时,需要使用一个指针指向链表中的第一个结点(头结点),这个指针我们称之为头指针

在这里插入图片描述
头指针保存了链表中头结点的存储位置,当链表为空时,头结点的指针域为空,即如果头指针为NULL时表示一个空表。
在这里插入图片描述

头节点与头指针的区别:不管带不带头结点,头指针都始终指向链表的第一个结点,而头结点是带头结点的链表中的第一个结点,节点内通常不存储信息。

引入头节点后,可以带来两个优点:

  • 由于第一个数据结点的位置被存放在头节点的指针域中,因此在链表的第一个位置上的操作和在表中的其他位置上的操作一致,无须进行特殊处理。
  • 无论链表是否为空,其头指针都是指向头节点的非空指针(空表中头节点的指针域为空),因此空表和非空表的处理就得到了统一。

单链表的基本操作

方法说明时间复杂度
头插法建立链表该方法是从一个空表开始,生成新结点,并将读取到的数据存放在新结点的数据域中,然后将新节点插入到当前链表的表头,即头节点之后。采用头插法建立单链表时,读取数据的顺序与生成的链表中的元素的顺序是相反的。 O ( n ) O(n) O(n)
尾插法建立单链表该方法将新的结点插入到当前链表的表尾。读取数据的顺序与生成的链表中的元素的顺序是一致的。 O ( n ) O(n) O(n)
按序号查找结点在单链表中从第一个结点出发,顺指针域逐个往下搜索,直到找到第i个结点位置,否则返回最后一个结点指针域NULL。 O ( n ) O(n) O(n)
按值查找表结点从单链表的第一个结点开始,由前往后依次比较表中各结点数据域的值,若某结点数据域的值等于给定值e,则返回该结点的指针,若没有,则返回最后一个结点指针域NULL。 O ( n ) O(n) O(n)
插入结点操作插入结点操作将值为x的新结点插入到单链表的第i个位置上。先检查插入位置的合法性(是否为空),然后找到待插入位置的前驱节点,即第i-1个结点,再在其后插入新结点。 O ( 1 ) O(1) O(1) O ( n ) O(n) O(n)
删除结点操作删除结点操作时将单链表的第i个结点删除。先检查删除位置的合法性,后查找表中第i-1个结点,即被删除的结点的前驱结点,再将其删除。O(1) 或 或 O(n)$
求表长操作求表长操作就是计算单链表中数据结点(不含头节点)的个数,需要从第一个结点开始顺序依次访问表中的每个结点,为此需要设置一个计数器变量,没访问一个结点,计数器就加1,直到访问到空结点为止 O ( n ) O(n) O(n)

双链表

单链表结点中只有一个指向其后继的指针,使得单链表只能从头结点依次顺序地向后遍历。要访问某个结点的前驱结点(插入、删除操作时),只能从头开始遍历,访问后继结点的时间复杂为 O ( 1 ) O(1) O(1),访问前驱结点的时间复杂度为 O ( n ) O(n) O(n)

为了克服上述缺点,引入了双链表,双链表结点中有两个指针pre(前驱指针)和next(后继指针),分别指向其前驱结点和后继结点:

在这里插入图片描述

双链表的基本操作

双链表在单链表的结点中增加了一个指向其前驱的pre指针,因此在双链表中的按值查找和按位查找的操作与单链表的相同。但双链表在插入和删除操作的实现上,与单链表有着较大的不同。这是因为“链”变化时也需要对pre指针做出修改,其关键是保证在修改的过程中不断链。此外,双链表可以很方便地找到其前驱结点,因此,插入、删除操作地时间复杂度仅为 O ( 1 ) O(1) O(1)

循环链表

在一个 循环链表中, 首节点和末节点被连接在一起。这种方式在单向和双向链表中皆可实现。要转换一个循环链表,你开始于任意一个节点,然后沿着列表的任一方向直到返回开始的节点。再来看另一种方法,循环链表可以被视为“无头无尾”。这种列表很利于节约数据存储缓存。

循环单链表和单链表的区别在于,表中最后一个结点的指针不是NULL,而改为指向头结点,从而整个链形成一个环,因此循环链表的判空条件不是头结点的指针是否为空,而是他是否等于头指针。

在这里插入图片描述

双向循环链表最后一个节点的next指向头结点,头结点的pre指向最后一个结点。

在这里插入图片描述

块状链表

块状链表本身是一个链表,但是链表储存的并不是一般的数据,而是由这些数据组成的顺序表。每一个块状链表的节点,也就是顺序表,可以被叫做一个块。

块状链表通过使用可变的顺序表的长度和特殊的插入、删除方式,可以在达到 O ( n ) O({\sqrt n}) O(n )的复杂度。块状链表另一个特点是相对于普通链表来说节省内存,因为不用保存指向每一个数据节点的指针。

存储结构

链表中的结点不需要以特定的方式存储,但是集中存储也是可以的,主要分下面这几种具体的存储方法:

  • 共享存储空间
    链表的结点和其它的数据共享存储空间,优点是可以存储无限多的内容(不过要处理器支持这个大小,并且存储空间足够的情况下),不需要提前分配内存;缺点是由于内容分散,有时候可能不方便调试。
  • 独立存储空间
    一个链表或者多个链表使用独立的存储空间,一般用数组或者类似结构实现,优点是可以自动获得一个附加数据:唯一的编号,并且方便调试;缺点是不能动态的分配内存。

顺序表和链表的比较

相比较顺序表,链表插入和删除的时间复杂度虽然一样,但仍然有很大的优势,因为链表的物理地址是不连续的,它不需要预先指定存储空间大小,或者在存储过程中涉及到扩容等操作,同时它并没有涉及的元素的交换。

相比较顺序表,链表的查询操作性能会比较低。因此,如果我们的程序中查询操作比较多,建议使用顺序表,增删操作比较多,建议使用链表。

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

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

相关文章

Java EE企业级应用开发(SSM)第5章

第5章Spring MVC入门一.预习笔记 1.Spring MVC是所有使用OOP编程语言都应该遵守的规范 2.Spring MVC的特点 强大的灵活性、非侵入性和可配置性 提供了一个前端控制器DispatcherServlet,开发者无须额外开发控制器对象 分工明确,每一个功能由一个专门…

日前、日内两阶段需求响应热电综合能源联合调度研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

深度学习之卷积神经网络0基础入门学习教程——浅层深度学习(全网最详细,不详细你打我)(看不懂你打我)(对小白没用你打我)

作为一个双非学校的人工智能硕士研究生,我在深度学习入门之初,学校里没人带,只能靠自己一点一点的摸索,走了很多弯路,因为自己并不懂得从哪里入手,从吴恩达的课到李沐的课等等无数种课,无数种书…

Microsoft project 2013安装教程(含激活方法)

目录 一、介绍 二、安装教程 三、激活 一、介绍 Microsoft project 2013中文版是由微软推出的一款项目管理软件,软件将可用性、功能和灵活性等完美地融合在一起,可以有效提升办公人员的效率,利用project 2013用户可以制作出…

SecureCRT8.5的下载、安装和注册(详细图解)

SecureCRT8.5的下载、安装和注册请先关闭杀毒软件和防火墙。 关闭防火墙 先打开电脑的设置,在弹出的界面里找到并点击更新和安全。 找到并点击Windows 安全中心,再在右侧找到并点击防火墙和网络保护选项。 将域网络、专用网络、公用网络这三个选项设…

数据结构入门-11-红黑树

史上最负盛名的平衡二叉树–红黑树,但其实就是2-3树的一种实现 文章目录一、红黑树性质二、红黑树性质推导过程2-3树2.3.1 如何维护绝对平衡2-3树2.3.2 红黑树&2-3树2.3.3 再来看红黑树的性质1.每个节点为 Black or Red2.根节点是Black3.每一个叶子节点(最后的空…

2023年郑州重点建设项目名单公布,中创“算力数据中心”项目入选!

4月7日,郑州市人民政府网站公布2023年郑州市重点建设项目名单,名单共列项目680个,总投资1.08万亿元,年度计划投资2691亿元。 在创新驱动能力提升项目名单里,中创算力与人民网人民数据(国家大数据灾备中心&a…

小程序实现消息订阅及发送

在我们的家政服务小程序中,用户可以新增预约。一般的场景是新增预约的时候提醒用户接收通知,在状态变更的时候我们来发送订阅消息。本篇我们来讲解一下小程序订阅消息功能的开发。 1 开通订阅消息模板 要想发送订阅消息,首先需要选用一个消…

【ES】数据同步集群

【ES】数据同步&集群3.数据同步3.1.思路分析3.1.1.同步调用3.1.2.异步通知3.1.3.监听binlog3.1.4.选择3.2.实现数据同步3.2.1.思路3.2.2.导入demo3.2.3.声明交换机、队列1)引入依赖2)声明队列交换机名称3)声明队列交换机3.2.4.发送MQ消息…

解决macOS IntelliJ IDEA 卡顿问题

写在前面的话1:我在撰写这篇博客时候,所用的IntelliJ IDEA版本是IntelliJ IDEA 2022.3.3 (Ultimate Edition),你需要知道可能对于不同的IntelliJ IDEA版本会有一定的差异 写在前面的话2:如果我这篇博客可以帮助到你,请…

国内可用的 ChatGPT

国内可用的 ChatGPT 替代列表功能和使用顺便推荐列表 https://chatgpt.qdymys.cn/ :三小时只能用10次 https://alllinkai.com/ :体验完,要登录,不推荐 https://gpttalk.live/ :每天限制使用次数 https://chatgpt-c…

深入探讨机器学习中的过拟合现象及其解决方法

1. What❓ 过拟合(Overfitting)是指在机器学习中,模型在训练集上表现较好,但在测试集或实际应用中表现较差的现象。过拟合发生时,模型过于复杂地学习了训练集中的噪声、异常值或特定模式,从而导致对新样本…

限流:计数器、漏桶、令牌桶 三大算法的原理与实战(史上最全)

限流 限流是面试中的常见的面试题(尤其是大厂面试、高P面试) 注:本文以 PDF 持续更新,最新尼恩 架构笔记、面试题 的PDF文件,请到文末《技术自由圈》公号获取 为什么要限流 简单来说: 限流在很多场景中用来…

教程 | 近红外数据的预处理和平均(上)

前言 近红外光谱(NIRS)是一种测量流经传感器所在组织的血液中氧合水平的方法。它基于这样一个事实,即含氧血红蛋白和脱氧血红蛋白具有不同的吸收光谱,因此你会看到它有不同的颜色。大多数近红外系统在每个光源光电二极管发射2个波长的光,通常…

【记录】ORB_SLAM2 例程(README文件里的单双目RDB-D、ROS、AR、外接摄像头、点云)

第一次跑 ORB_SLAM2,记录一下一、普通环境0.build.sh 遇到的问题(1)usleep(2)AlignedBit1.单目、TUM数据集2.双目、KITTI数据集3.RGB-D、TUM数据集二、ROS0.build_ros.sh 遇到的问题(1)rospack …

【C++】结构体应用案例 1

目录 1、缘起 2、案例描述 3、案例分析 4、代码清单 1 5、代码清单 2 6、总结 1、缘起 最近学习完了 C 语言的结构体相关知识点,如 结构体数组,结构体指针,结构体嵌套结构体 和 结构体做函数参数。本篇博客围绕着这些知识点&#xff0c…

【华为机试真题详解JAVA实现】—Sudoku

目录 一、题目描述 二、解题代码 一、题目描述 问题描述:数独(Sudoku)是一款大众喜爱的数字逻辑游戏。玩家需要根据9X9盘面上的已知数字,推算出所有剩余空格的数字,并且满足每一行、每一列、每一个3X3粗线宫内的数字均含1-9,并且不重复。 例如: 输入 输出

SpringCloud学习-实用篇02

以下内容的代码可见:SpringCloud_learn/day02 1.Nacos配置管理 之前提到的Nacos是作为注册中心,除此之外它还有配置管理功能 统一配置管理 假设有多个微服务之间有关联,此时修改了某个微服务的配置后其他相关的微服务也需要重启,十…

Javaweb | 过滤器、配置、过滤器链、优先级

💗wei_shuo的个人主页 💫wei_shuo的学习社区 🌐Hello World ! 过滤器 概念 过滤器(Filter)是处于客户端与服务器目标资源之间的一道过滤技术 用户的请求和响应都需要经过过滤器 过滤器作用 执行地位在Servl…

C++初阶 -1- C++入门part2

文章目录6.引用什么是引用?引用的使用引用的应用传值、传引用效率比较权限引用和指针的区别⭐7.内联函数8.auto关键字9.基于范围的for循环10.指针空值——nullptr6.引用 什么是引用? “别名” int a 0; int& b 0;👆即 地址为0x00000…