一、基本定义
单链表是链式存储的线性表,由若干节点组成,每个节点包含 数据域(存储元素值)和 指针域(存储下一个节点的地址);链表最后一个节点的指针域为 null,还可设置头节点(不存数据,方便操作)或头指针(指向第一个节点)。
二、核心特点
-
物理存储上非连续、非顺序,节点通过指针连接。
-
不支持随机访问,访问第 i 个节点需从表头遍历,时间复杂度 O(n)。
-
增删操作无需移动元素,只需修改指针指向,时间复杂度 O(1)(已知操作节点的前驱节点)。
-
相比顺序表,空间开销更大(需额外存储指针)。
三、核心操作(Java 伪代码思路)
- 节点类定义
class Node {
int data; // 数据域
Node next; // 指针域
public Node(int data) {
this.data = data;
this.next = null;
}
}
- 基础操作
• 遍历:从头节点开始,循环访问每个节点直到 next 为 null。
• 插入(指定位置):找到插入位置的前驱节点,将新节点 next 指向后继节点,再将前驱节点 next 指向新节点。
• 删除(指定节点):找到待删节点的前驱节点,将其 next 指向待删节点的后继节点,释放待删节点空间。
• 查找:遍历链表,对比节点数据域与目标值,找到则返回节点,否则返回 null。
四、常见问题与优化
-
空指针异常:操作前需判断头节点、当前节点、next 指针是否为 null。
-
头节点处理:添加头节点可统一空链表和非空链表的操作逻辑,无需单独判断。
-
快慢指针应用:可用于判断链表是否有环、找链表中间节点等场景。