一、链表是什么
1、链表是物理存储单元上非连续的、非顺序的存储结构,数据元素的逻辑顺序是通过链表的指针地址实现,有一系列结点(地址)组成,结点可动态的生成。
2、结点包括两个部分:存储数据元素的数据域(内存空间),和存储指向下一个结点地址的指针域。
3、相对于线性表顺序结构,操作复杂。
二、链表用途:
1、实现文件系统;2、排序;3、管理动态数据;4、存储稀疏数据;5、实现各种数据结构;6、实现高效的内存分配器。实现文件系统是指,链表可以被用来实现文件系统中的文件目录结构。
1、实现文件系统
链表可以被用来实现文件系统中的文件目录结构,每个节点可以表示一个文件或者一个目录,而整个文件系统可以看做一个包含多个节点的链表结构。
2、排序
链表可以用于实现排序算法,例如归并排序和快速排序。这些算法通常需要在运行时动态创建和删除节点,这正是链表的长处。
3、管理动态数据
链表是一种动态数据结构,可以自由添加和删除节点,因此它经常用于管理动态大小的数据集合,例如文件系统、操作系统内存管理和网络协议。
4、存储稀疏数据
链表也可用于存储稀疏数据结构,例如稀疏矩阵。由于链表可以有效地管理和存储无序的数据集合,因此它是一种有效的方法来存储稀疏数据。
5、实现各种数据结构
表通常用于实现其他高效的数据结构,例如队列、栈和哈希表。链表提供了高效的插入和删除操作,可以在 O(1) 的时间内执行,而数组等其他数据结构需要进行大量的数据搬迁。
可用链表实现的数据结构:
- 线性数据结构:链表可以用来实现栈、队列、链式队列等线性数据结构,而且基于链表实现的栈和队列可以动态增长,比基于数组的实现更灵活。
- 哈希表:哈希表使用链表可以解决哈希碰撞(Hash Collision)的问题,链表可以用来构成哈希桶,当出现哈希碰撞时将冲突的数据添加到链表的末尾。
- 图和树:链表可以用来描述和实现复杂的图和树数据结构,每个节点可以使用链表来存储子节点或相邻的节点。
6、实现高效的内存分配器
链表可以被用来实现文件系统中的文件目录结构,每个节点可以表示一个文件或者一个目录,而整个文件系统可以看做一个包含多个节点的链表结构。
三、链表的优缺点
优点:链表实现数据元素储存的顺序储存,是连续的
- 动态类型数据结构:链表能够在运行时发展和收缩,这是由于通过分配和不分配内存执行的动态组织。因此,不需要为链表提供主要大小。
- 不浪费内存:链表提供了有效内存利用率的实现,因为此列表的大小在运行时上升或下降;因此没有记忆的浪费。此外,不需要预先分配内存。
- 实现:线性类型的数据结构(如队列和堆栈)通常通过链表简单地执行。
- 插入和删除操作:在此链表中,可以轻松执行插入和删除查询操作。我们不需要在元素的惰性和删除操作后移动元素,只需要修改后续指针中可用的地址。
缺点:因为含有大量的指针域,所以占用空间大,同时因为只有头结点(后面说明)是明确知道地址的,所以查找链表中的元素需要从头开始寻找,非常麻烦。
四、链表的分类及其代码实现
链表主要分为单链表、双链表、循环链表、静态链表
1.单链表
在这种链表中,每个节点都包含少量数据以及指向属于类似数据类型的后续节点的指针。这是一种简单易行的链表类型。在这里,节点由指向后续节点的指针组成,该节点定义该节点将后续节点的地址保留在结构中。此单向链表仅允许以单一方式遍历数据。
单链表分为带头结点的和不带头结点的。
2.双链表
这种双向类型的 LinkedIn List 是一种比前一种更复杂的链表,前一种链表由指向结构中后续节点和前一个节点的指针组成。因此,它包括链表工作的三个部分,其中包括数据,指向后续节点的指针,最后是指向前一个节点的指针。此外,这将使我们能够向后遍历双向链表。
3.循环链表
这是一种双向循环类型的链表,一种有点复杂的类型,包含指向结构中后续节点和前一个节点的指针。在这里,循环双向链表和双向链表之间的差异显示了循环链表与单链表之间的相似性。但是在这个双循环链表中,我们无法在初始节点的前面字段中找到 null 值。
循环单链表的好处是从一个结点出发,可以找到其他任何一个结点。
4.静态链表
所有截图代码均来自王道考研链表_哔哩哔哩_bilibili