专栏首页mukekeheart的iOS之旅数据结构--线性表和链表的基础知识

数据结构--线性表和链表的基础知识

近期准备重新学习一下常用数据结构和基本算法,并计划将这些内容的只是做一个整理和归类,准备慢慢写一个常用数据结构与基本算法的系列博文,博文列表参见:常用数据结构与基本算法博文系列,目前内容还比较少,后续慢慢补充。本文主要内容是介绍 数据结构--线性表和链表的基础知识。

一 线性表概述

1.1 线性表概念

线性表,全名为线性存储结构。使用线性表存储数据的方式可以这样理解,即“把所有数据用一根线儿串起来,再存储到物理空间中”。

如上图所示,这是一组具有“一对一”关系的数据,我们接下来采用线性表将其储存到物理空间中。首先,用“一根线儿”把它们按照顺序“串”起来,如图下图 所示:

1.2 线性表存储结构

上图中,左侧是“串”起来的数据,右侧是空闲的物理空间。把这“一串儿”数据放置到物理空间,我们可以选择以下两种方式,如下图所示。

图 3a) 是多数人想到的存储方式,而图 3b) 却少有人想到。我们知道,数据存储的成功与否,取决于是否能将数据完整地复原成它本来的样子。如果把图 3a) 和图 3b) 线的一头扯起,你会发现数据的位置依旧没有发生改变(和图 1 一样)。因此可以认定,这两种存储方式都是正确的。上图中我们可以看出,线性表存储数据可细分为以下 2 种:

  1. 如图 3a) 所示,将数据依次存储在连续的整块物理空间中,这种存储结构称为顺序存储结构(简称顺序表);
  2. 如图 3b) 所示,数据分散的存储在物理空间中,通过一根线保存着它们之间的逻辑关系,这种存储结构称为链式存储结构(简称链表);

将具有“一对一”关系的数据“线性”地存储到物理空间中,这种存储结构就称为线性存储结构(简称线性表),线性表存储结构可细分为顺序存储结构和链式存储结构。使用线性表存储的数据,如同向数组中存储数据那样,要求数据类型必须一致,也就是说,线性表存储的数据,要么全不都是整形,要么全部都是字符串。一半是整形,另一半是字符串的一组数据无法使用线性表存储。(有一些弱类型编程语言(如python、MATLAB等)中的数组或者列表中元素的数据类型可以不一致,这都是在我们今天讲的基础上进行扩展的)。

1.3 前驱和后继

数据结构中,一组数据中的每个个体被称为“数据元素”(简称“元素”)。例如,图 1 显示的这组数据,其中 1、2、3、4 和 5 都是这组数据中的一个元素。另外,对于具有“一对一”逻辑关系的数据,我们一直在用“某一元素的左侧(前边)或右侧(后边)”这样不专业的词,其实线性表中有更准确的术语:

  • 某一元素的左侧相邻元素称为“直接前驱”,位于此元素左侧的所有元素都统称为“前驱元素”;
  • 某一元素的右侧相邻元素称为“直接后继”,位于此元素右侧的所有元素都统称为“后继元素”;

以图 1 数据中的元素 3 来说,它的直接前驱是 2 ,此元素的前驱元素有 2 个,分别是 1 和 2;同理,此元素的直接后继是 4 ,后继元素也有 2 个,分别是 4 和 5。如下图4 所示:

二 顺序表

2.1 顺序表的概念

顺序表,全名顺序存储结构,是线性表的一种。在前面的内容中我们提到,线性表用于存储逻辑关系为“一对一”的数据,顺序表自然也不例外。不仅如此,顺序表对数据的物理存储结构也有要求。顺序表存储数据时,会提前申请一整块足够大小的物理空间,然后将数据依次存储起来,存储时做到数据元素之间不留一丝缝隙。例如,使用顺序表存储集合 {1,2,3,4,5},数据最终的存储状态如下图所示:

由此我们可以得出,将“具有 '一对一' 逻辑关系的数据按照次序连续存储到一整块物理空间上”的存储结构就是顺序存储结构。通过观察上图中数据的存储状态,我们可以发现,顺序表存储数据同数组非常接近。其实,顺序表存储数据使用的就是数组

2.2 顺序表的基本操作

顺序表的基本操作包括顺序表的初始化、插入元素、删除元素、更改元素、查找元素等。这些基本操作的很简单,就不一一解释了,具体代码后续加上。

三 链表

3.1 链表的概念

链表,别名链式存储结构或单链表,用于存储逻辑关系为 "一对一" 的数据。与顺序表不同,链表不限制数据的物理存储状态,换句话说,使用链表存储的数据元素,其物理存储位置是随机的。例如,使用链表存储 {1,2,3},数据的物理存储状态如下图所示:

我们看到,上图根本无法体现出各数据之间的逻辑关系。对此,链表的解决方案是,每个数据元素在存储时都配备一个指针,用于指向自己的直接后继元素。如下图所示,数据元素随机存储,并通过指针表示数据之间逻辑关系的存储结构就是链式存储结构。

3.2 链表的节点

从上图可以看到,链表中每个数据的存储都由以下两部分组成,即链表中存储各数据元素的结构如下图所示:

  1. 数据元素本身,其所在的区域称为数据域;
  2. 指向直接后继元素的指针,所在的区域称为指针域;

上图所示的结构在链表中称为节点。也就是说,链表实际存储的是一个一个的节点,真正的数据元素包含在这些节点中,如下图所示:

3.3 链表的组成要素

其实,上图所示的链表结构并不完整。一个完整的链表需要由以下几部分构成:

  1. 头指针:一个普通的指针,它的特点是永远指向链表第一个节点的位置。很明显,头指针用于指明链表的位置,便于后期找到链表并使用表中的数据;
  2. 节点:链表中的节点又细分为头节点、首元节点和其他节点:
    • 头节点:其实就是一个不存任何数据的空节点,通常作为链表的第一个节点。对于链表来说,头节点不是必须的,它的作用只是为了方便解决某些实际问题;
    • 首元节点:由于头节点(也就是空节点)的缘故,链表中称第一个存有数据的节点为首元节点。首元节点只是对链表中第一个存有数据节点的一个称谓,没有实际意义;
    • 其他节点:链表中其他的节点;

因此,一个存储 {1,2,3} 的完整链表结构如下图 所示:

注意:链表中有头节点时,头指针指向头节点;反之,若链表中没有头节点,则头指针指向首元节点。

3.4 链表的分类

链表根据其前驱、后继的索引特征可以分为单向链表、双向链表和循环链表三类。

单向链表:表中各节点中都只包含一个指针(游标),且都统一指向直接后继节点,通常称这类链表为单向链表(或单链表)。单链表的数据块和链表形式就是我们前面介绍的。

双向链表:表中各各节点之间的逻辑关系是双向的,节点中都包含两个指针,一个指向直接后继节点、一个指向直接前驱节点,通常称这类链表为双向链表(或双链表)。双向链表中各节点包含以下 3 部分信息(如下图所示):

  1. 指针域:用于指向当前节点的直接前驱节点;
  2. 数据域:用于存储数据元素。
  3. 指针域:用于指向当前节点的直接后继节点;

循环链表:表中头尾节点相连,构成一个环。需要注意的是,虽然循环链表成环状,但本质上还是链表,因此在循环链表中,依然能够找到头指针和首元节点等。循环链表和普通链表相比,唯一的不同就是循环链表首尾相连,其他都完全一样。循环链表又可以分为单向循环链表和双向循环链表。

3.5 链表的基本操作

链表的基本操作与顺序表一样,包括链表的初始化、插入元素、删除元素、更改元素、查找元素等。这些基本操作的含义很简单,就不一一解释了,具体代码后续加上。

3.5.1 单链表的基本操作

插入元素操作:向单链表中增添元素,根据添加位置不同,可分为以下 3 种情况:

  • 插入到链表的头部(头节点之后),作为首元节点;
  • 插入到链表中间的某个位置;
  • 插入到链表的最末端,作为链表中最后一个数据元素;

虽然新元素的插入位置不固定,但是链表插入元素的思想是固定的,只需做以下两步操作,即可将新元素插入到指定的位置:

  1. 将新结点的 next 指针指向插入位置后的结点;
  2. 将插入位置前结点的 next 指针指向插入结点;

例如,我们在链表 {1,2,3,4} 的基础上分别实现在头部、中间部位、尾部插入新元素 5,其实现过程如下图所示:

删除元素操作:从链表中删除指定数据元素时,实则就是将存有该数据元素的节点从链表中摘除,但作为一名合格的程序员,要对存储空间负责,对不再利用的存储空间要及时释放。因此,从链表中删除数据元素需要进行以下 2 步操作:

  1. 将结点从链表中摘下来;
  2. 手动释放掉结点,回收被结点占用的存储空间;

例如,从存有 {1,2,3,4} 的链表中删除元素 3,则此代码的执行效果如下图所示:

3.5.2 双链表的基本操作

插入元素操作:双向链表的插入元素的操作与单向链表基本一样,也是分为三种情况,只是在插入元素时需要考虑前驱和后继两个指针的变化。

  • 添加至表头:
  • 添加到中间位置:
  • 添加到末尾:

删除元素操作:双链表删除结点时,也是跟单向链表一样,只需遍历链表找到要删除的结点,然后将该节点从表中摘除即可。

本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!
本文分享自作者个人站点/博客:https://www.cnblogs.com/mukekeheart/复制
如有侵权,请联系 cloudcommunity@tencent.com 删除。
登录 后参与评论
0 条评论

相关文章

  • Algorithms_基础数据结构(02)_线性表之链表_单向链表

    N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。

    小小工匠
  • Algorithms_基础数据结构(03)_线性表之链表_双向链表

    Algorithms_基础数据结构(02)_链表&链表的应用案例之单向链表中梳理了 单向链表的基本操作,接下来我们继续来看下双向链表吧。

    小小工匠
  • 基础算法 | 数据结构之线性表&顺序表&链表(上)

    各位,起床了起床了 小编又来送干货了 今天讲的是数据结构 全文字数:1185字 阅读时间:10分钟 数据结构?啥玩意? * 内容提要: *预备知识 *顺序表(S...

    用户1621951
  • 数据结构基础-链表

    数组一样能用来存储数据集合,那为什么用多种数据结构来做一样的事情。因为后来发现数组在处理一些情况下的弊端,所以开始分使用情景用不同的工具干同样的事情。 先说说...

    1025645
  • 数据结构-线性表(顺序表与链表的基本知识 以及ArrayList 源码分析)

    比如:美女和野兽,抽象的事物表示美女:头发长 前凸后翘。。。 可以表示为一个数据单元,野兽也是一个数据单元。

    用户3045442
  • 数据结构03 线性表之链表

    上一篇总结完了顺序表,这一篇要总结的是线性表之中的链表。我将会从以下几点进行总结: 1、为什么要使用链表?  2、链表的存储结构?  3、链表的常用操作代码实现...

    nnngu
  • 【数据结构】线性表的链式表示之单链表

    同样在这篇文章中主要讲插入和删除元素,因为另外两个操作都可以基于删除操作演变而来,所以改、查两个操作只给出代码。

    程序员周同学
  • 【数据结构】线性表|顺序表|链表(下)

    前面介绍了单链表,相信大家还记得相关的概念。其实循环链表跟单链表也没有差别很多,只是在某些细节上的处理方式会稍稍不同。

    短短的路走走停停
  • 【数据结构】线性表|顺序表|链表(上)

    1) 首先它是一个序列.里面的元素是有顺序的,如果有多个元素,除开头和结尾以外的元素都有一个前驱和一个后继.而开头元素只有后继,结尾元素只有前驱.

    短短的路走走停停
  • 数据结构-线性表|顺序表|链表(中)

    回到正题,继上次出了数据结构线性表的内容上以后,这次又给大家更新啦。这次介绍的是单链表和静态链表的内容,话不多说,开始我们的正题。

    短短的路走走停停
  • 数据结构-线性表|顺序表|链表(下)

    1 1 1 哈喽。各位小伙伴好久不见,热心的小编赶在开学季又来给大家送上满满的干货了。祝大家开心快乐! 继上两次咱们聊了顺序表、单链表、静态链表等知识。那么热爱...

    用户1621951
  • 数据结构-线性表|顺序表|链表(中)

    回到正题,继上次出了数据结构线性表的内容上以后,这次又给大家更新啦。这次介绍的是单链表和静态链表的内容,话不多说,开始我们的正题。 【注:代码下载请移步留言区】...

    用户1621951
  • 数据结构--线性表链式存储(链表)--单链表

    链表中的数据是以节点来表示的,每个结点的构成:元素( 数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址...

    风骨散人Chiam
  • python基础知识——内置数据结构(列表)

    列表是python中使用较多的一种数据结构,通常是作为函数的返回类型。相比较于元组,列表中的元素是可以修改的,可以实现添加、删除和查找的操作。

    zhaozhiyong
  • python基础知识——内置数据结构(列表)

    列表是python中使用较多的一种数据结构,通常是作为函数的返回类型。相比较于元组,列表中的元素是可以修改的,可以实现添加、删除和查找的操作。 1、列表的创建 ...

    zhaozhiyong
  • 数据结构:链表基础原理

    当我们在使用高级语言创建一个数组的时候,实际上是将这个指令传达了给操作系统里面的内存管理器(Memory Manager),内存管理器在收到指令后会在内存中分配...

    码农架构
  • 数据结构基础温故-1.线性表(下)

    在上一篇中,我们了解了单链表与双链表,本次将单链表中终端结点的指针端由空指针改为指向头结点,就使整个单链表形成一个环,这种头尾相接的单链表称为单循环链表,简称循...

    Edison Zhou
  • 数据结构基础温故-1.线性表(中)

    在上一篇中,我们学习了线性表最基础的表现形式-顺序表,但是其存在一定缺点:必须占用一整块事先分配好的存储空间,在插入和删除操作上需要移动大量元素(即操作不方便)...

    Edison Zhou
  • 数据结构基础温故-1.线性表(上)

    开篇:线性表是最简单也是在编程当中使用最多的一种数据结构。例如,英文字母表(A,B,C,D...,Z)就是一个线性表,表中的每一个英文字母都是一个数据元素;又如...

    Edison Zhou

扫码关注云+社区

领取腾讯云代金券