本文仅为复习时所记笔记,如有错误与不足还请指正。
-
线性表的定义:见上一篇文章:https://blog.csdn.net/qq_38652677/article/details/105330487?utm_source=app
-
线性表的链式存储又称为单链表,每个结点除了存放数据元素外,还存放指向下一个结点的指针。所以,链式存储并不要求大片连续的存储空间,所以改变容量十分方便,但因为还要存放指向下一结点的指针,所以空间利用率没有顺序表高,且不能随机存取(因为每个结点都存有指向下个节点的指针,所以如果要找到这个结点需要通过依次遍历前面的每一个结点才能找到这个结点)。
-
通常使用头指针来定义一个单链表,如果头指针为NULL则为空表。同时,为了操作方便常常在单链表第一个结点前附加一个结点,称为头结点,头节点内通常不存储信息(但也可用来记录表长等信息),头节点的指针域指向第一个元素结点。头指针始终指向链表的第一个结点。
-
单链表的基本操作
①定义
②初始化单链表
不带头结点
带头节点
③判断单链表是否为空
不带头结点
带头节结点
④按位序插入
不带头节点
带头结点
⑤按位序删除
思路:找到第i-1个结点,将其指针指向第i+1个结点,并释放第i个结点。
删除指定结点【但这种方法没有考虑p刚好时是最后一个指针的情况】
⑥查找
按值查找
按位查找
⑦求表的长度 -
双链表
双链表指针中仅有一个指向其后继的指针,从而使得只能从头向尾的依次进行遍历,要访问某个结点的前驱结点的前驱结点也只能从头进行遍历,非常不方便,从而引入了双链表的概念,双链表中有两个指针prior和next,分别指向其前驱和后继结点。 -
双链表的基本操作
①定义
②初始化
③插入
④删除
⑤销毁(双链表的销毁就是n次双链表的删除某一个结点)
⑥遍历
链表不能随机存取,按位查找、按值查找都只能通过遍历来实现。时间复杂度位O(1)。 -
循环链表
①循环单链表
②循环双链表
-
静态链表:分配一块连续的存储空间,各个结点集中安置。(单链表:各个结点在内存中星罗棋布)。静态链表是借助数组来描述线性表的链式存储结构,结点有数据域和指针域,其中指针域是结点的相对地址(数组下标),通常也称为游标,这里的地址是下一个元素的。优点是增加删除操作不用大量移动的元素。缺点是不能随机存取,只能从头结点依次往后查找。静态链表容量固定不变。
-
总结
顺序表和链表各有优缺点,不能单说哪一种好哪一种不好,以下从三个方面来评价。
①逻辑结构
都是线性表,都是线性结构。
②存储结构
顺序表支持随机存取,存储密度高,但大片连续的存储空间分配不方便。
链表离散的小空间分配方便,且改变容量方便,但不可随机存取,存储密度低(结点内还存有指针)。
③基本操作
a.创建
顺序表需预先分配大片连续空间(若空间过小,不可扩展,若空间过大,又可能造成浪费。)。
链表只用分配一个头结点(也可 不要头结点,只声明头指针)方便扩展。
b.销毁
顺序表:令length==0(静态分配系统会自动回收,动态分配需手动,用free()释放空间)。
链表:free()
c.增加/删除
顺序表:元素需要后移/前移。(时间复杂度为O(n))
链表:只需修改指针。(时间复杂度为O(n),主要是查找所消耗)
d.查找
顺序表:按位(时间复杂度O(1),体现随机存取的特点)
按值(时间复杂度O(n))
链表:按位(时间复杂度O(n)
按值(时间复杂度O(n))
本章内容较多,且为考试重点章节,一定要理解原理,切不可死记硬背。