Skip to content

链表

Linked list

节点通过指针连接并支持局部插入删除的线性数据结构。

条目类型
模型

形式陈述

链表是一种用节点引用实现的抽象数据类型,表示有序序列而不要求元素在内存中连续。每个节点存数据与到后继的引用,双向链表还存前驱。给定节点引用时,插入和删除只改常数条链接,时间 O(1);按位置查找第 i 个元素通常需从表头顺序走 O(i)。哨兵节点可统一空表和边界操作。

直觉

数组通过连续地址与地址算术快速跳到任意位置,链表则把序列的相邻关系、“下一个在哪里”显式存成指针。已知节点位置时,插入或删除只改常数个链接;代价是不能通过下标直接跳到第 i 个元素,遍历还具有较差的缓存局部性。抽象接口中的“位置”若只是索引,寻找该位置仍需线性时间,不能把查找成本藏起来。

链表插入指针改接示意图
例子与边界

在已知节点 x 后插入 y,只需令 y.next=x.nextx.next=y。若只给键值而未给节点位置,仍需线性搜索,所以“链表删除 O(1)”有前提。单链表删除当前节点通常还需前驱,除非可采用复制后继等特定技巧且语义允许。链表每节点有指针开销,局部性差,实际遍历常慢于数组;循环链表还需防止无限遍历。

双链表可常数时间删除已知节点,但多一个反向指针并需维护双向一致性。空表、尾指针、循环链表和迭代中删除都会改变边界不变式;悬空指针与所有权问题属于实现正确性的核心。

推论与应用

链表常实现栈、队列、双端队列、LRU 链和邻接表;B+ 树还用叶链支持范围扫描。不可变链表可通过共享尾部构造持久版本。与数组相比,它以随机访问和局部性换取稳定节点地址及局部结构修改,具体 ADT 的操作次序仍应由接口而非指针布局规定。

跳表在底层全量链表之上随机建立稀疏快车道,以期望对数搜索换额外指针;Move-to-Front按访问重排链表,用竞争分析而非最坏查找界评价。两者都不是普通链表常数插删性质的直接推论。指针机模型只允许沿指针导航,不能把数组下标或 Word-RAM 位操作默认为常数,这正是链式结构下界与设计的模型边界。

参考资料
  • Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein, Introduction to Algorithms, 4th ed., MIT Press, 2022,Parts I–VI。
  • Robert Sedgewick and Kevin Wayne, Algorithms, 4th ed., Addison-Wesley, 2011,Chs. 1–6。
关系图谱9 个相邻概念 · 2 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组
类型化关系

并列辨析