一、链表的本质与结构
1.1 什么是链表?
链表是一种线性数据结构,但与数组不同,它的元素在内存中并不是连续存储的。每个元素(称为'节点')都包含两部分:
- 数据域:存储实际的数据
- 指针域:存储指向下一个节点的引用
这种结构使得链表具有动态内存分配的特性,可以高效地进行插入和删除操作,而不需要像数组那样预先分配固定大小的内存空间。
1.2 链表的核心组件
让我们更详细地解剖一个链表节点:
| 组件部分 | 描述 | 内存占用 |
|---|---|---|
| 数据域 | 存储实际的数据值,可以是任何数据类型 | 取决于数据类型 |
| 指针域 | 存储下一个节点的内存地址 | 通常 4 或 8 字节 (32/64 位系统) |
在 C 语言中,一个典型的链表节点定义如下:
struct ListNode {
int data; // 数据域
struct ListNode* next; // 指针域
};
二、链表的类型大全
链表并非只有单一形式,根据指针的指向方式,可以分为多种类型:
2.1 单向链表 (Singly Linked List)
最基本的链表形式,每个节点只有一个指向下一个节点的指针。
头节点 -> 节点 A -> 节点 B -> 节点 C -> NULL
特点:
- 只能单向遍历
- 插入/删除头节点 O(1) 时间复杂度
- 平均查找时间复杂度 O(n)
2.2 双向链表 (Doubly Linked List)
每个节点包含两个指针,分别指向前驱和后继节点。
NULL <- 头节点 <-> 节点 A <-> 节点 B <-> NULL
优势:
- 可以双向遍历
- 删除特定节点更高效
- 可实现更复杂的数据结构如双端队列
2.3 循环链表 (Circular Linked List)
尾节点指向头节点,形成环形结构。
头节点 -> 节点 A -> 节点 B -> 节点 C -> 头节点
应用场景:
- 轮询调度算法
- 约瑟夫问题
- 循环缓冲区实现
三、链表的操作全解析
3.1 基本操作时间复杂度对比
| 操作 | 数组 | 单向链表 | 双向链表 |
|---|---|---|---|
| 访问元素 | O(1) |


