线性表

线性表是由零个或多个同类型元素组成的有限序列。除首元素外,每个元素有且仅有一个直接前驱;除尾元素外,每个元素有且仅有一个直接后继。成绩列表、待办事项和一行字符都可抽象为线性表。

逻辑结构与存储结构

线性表描述的是元素间的逻辑关系,不限定内存中的摆放方式。顺序表以连续内存保存元素;链表通过节点中的链接关系组织元素,节点可以分散存放。两种实现的操作代价不同,应按主要操作选择。

顺序存储

顺序表将元素连续放入内存。若首元素地址为 Loc(a₁)、每个元素占 d 个存储单元,第 i 个元素地址为 Loc(aᵢ)=Loc(a₁)+(i-1)d。因此可在 O(1) 时间按下标随机访问;但在中间插入或删除时,后续元素必须移动,时间为 O(n)。

链式存储

链表节点保存数据域和后继节点的位置(双向链表还保存前驱)。已知目标节点或其前驱时,插入、删除只需修改链接,为 O(1);按序号访问必须从头逐个遍历,为 O(n)。节点链接还会带来额外存储开销和较差的缓存局部性。

操作顺序表链表
按下标访问O(1)O(n)
已知位置插删O(n)O(1)
存储特点连续、缓存友好节点可分散、含链接开销

需要频繁随机访问时通常选择数组或 vector;需要在已知位置频繁局部修改时,链表更合适。