链表Linked list

通过指针连接元素,调整链接完成插入或删除。

核心约束
节点以链接确定顺序,内存位置不必连续。
适用问题
频繁摘除、重排已知节点,侵入式对象管理。
边界与取舍
指针占用空间;遍历的缓存局部性通常较差。
ABCD
双向链表:每个节点保存前驱和后继。已知节点时可摘除它;按位置查找仍需遍历。

常见操作#

n 为节点数;以下常数时间操作假定已拿到所需节点。

操作时间复杂度条件与说明
按位置 / 按值查找O(n)O(n)链表没有下标到地址的直接映射,最坏需顺着链接遍历。
头部插入 / 删除O(1)O(1)更新固定数量的指针;节点分配与释放另计。
已知位置插入O(1)O(1)单链表须已知前驱;双向链表可以在已知节点前后插入。
删除已知节点O(1)O(1)双向链表;单链表通常还需要前驱,寻找前驱最坏 O(n)O(n)。
尾部追加O(1)O(1)维护尾指针;没有尾指针时需要 O(n)O(n) 寻尾。
遍历 / 构建O(n)O(n)访问每个节点;构建假定单个节点分配视作常数操作。

时间与空间#

时间复杂度
定位 O(n)O(n);已知位置修改 O(1)O(1)
存储空间
O(n)O(n)

每个节点另存一个或两个链接;不包含外部分配器元数据。

工程中的应用#

10 个案例 · 附源码
基础原理参考资料

Java 21 · LinkedList双向链表的下标遍历规则、首尾操作与迭代器修改接口。

Linux 6.12 · list.h内核双向链表的增删、遍历和移动操作。

7 个概念