速查:顺序表与链表
速查表:核心是教材 2.3.6「顺序表和链表的比较」的四个维度。第 2 章的概念页与指针语句真题见 2.1~2.2、2.3.1~2.3.2、2.3.3~2.3.6。
四个维度(2.3.6)
1. 存取(读/写)方式
顺序表既可以顺序存取,也可以随机存取,链表只能从表头开始依次顺序存取。 例如在第
个位置上执行存取的操作,顺序表仅需一次访问,而链表则需从表头开始依次访问 次。
2. 逻辑结构与物理结构
采用顺序存储时,逻辑上相邻的元素,对应的物理存储位置也相邻。而采用链式存储时,逻辑上相邻的元素,物理存储位置不一定相邻,对应的逻辑关系是通过指针链接来表示的。
3. 查找、插入和删除操作
| 操作 | 顺序表 | 链表 |
|---|---|---|
| 按值查找(表无序) | ||
| 按值查找(表有序) | ||
| 按序号查找 | ||
| 插入、删除 | 平均需要移动半个表长的元素 | 只需修改相关结点的指针域 |
4. 空间分配
| 顺序表 | 链表 | |
|---|---|---|
| 分配时机 | 静态分配需一次性给足;动态分配可扩容,但扩容需要移动大量元素,操作效率低 | 只在需要时申请,只要内存足够就能分配 |
| 空间利用 | 预分配过大浪费、过小溢出 | 每个结点有指针域,存储密度低于顺序表 |
选择建议
| 场景 | 选择 |
|---|---|
| 表长可预估、变化不大 | 顺序表 |
| 频繁按序号存取 | 顺序表( |
| 表长难以预估、频繁增删 | 链表 |
| 要用折半查找 | 只能顺序表 |
| 要用折半插入、希尔、快排、堆排序 | 只能顺序表(需随机存取) |
四种链表对照
| 单链表 | 双链表 | 循环单链表 | 循环双链表 | |
|---|---|---|---|---|
| 指针域 | next | prior + next | next | prior + next |
| 找前驱 | ||||
| 表尾特征 | next==NULL | next==NULL | next==L | next==L |
| 判空 | L->next==NULL | 同左 | L->next==L | L->next==L && L->prior==L |
| 从任一结点访问全表 | 否 | 否 | 是 | 是 |
静态链表(2.3.5)
- 用数组来描述线性表的链式存储结构,结点也有
data和next,但指针是结点在数组中的相对地址(数组下标),也称游标。 - 和顺序表一样,静态链表也要预先分配一块连续的内存空间。
- 以
next == -1作为其结束的标志。 - 插入、删除操作与动态链表的相同,只需要修改指针,而不需要移动元素。
- 教材评价:「总体来说,静态链表没有单链表使用起来方便,但在一些不支持指针的高级语言(如 Basic)中,这是一种非常巧妙的设计方法。」
高频边界
| 说法 | 判断 | 说明 |
|---|---|---|
| 「链表可以随机存取」 | ❌ | 只能从表头依次顺序存取 |
| 「顺序表只能顺序存取」 | ❌ | 顺序存取和随机存取都可以 |
| 「链表插入删除是 | ⚠️ | 已定位到位置时是;若要先查找仍是 |
| 「链表不需要连续空间」 | ✅ | 但静态链表需要(用数组实现) |
| 「静态链表是顺序存储」 | ⚠️ | 物理上是数组,逻辑上是链式;结束标志是 next==-1 |
| 「链表的存储密度更高」 | ❌ | 更低,每个结点多一个指针域 |
| 「有序链表可以折半查找」 | ❌ | 折半要求随机存取 |
| 「顺序表扩容代价很小」 | ❌ | 需要移动大量元素,操作效率低 |
「循环单链表判空是 L->next==NULL」 | ❌ | 是 L->next==L |
链接
- 📕 返回:数据结构表格附录
- 📗 全书地图:数据结构全书地图
- 🔗 折半查找为何只能顺序存储:7.2.2 折半查找
- 🔗 同义词链就是单链表:7.5.3 处理冲突的方法
- 🔗 概念页:2.1~2.2 线性表与顺序表 · 2.3.1~2.3.2 单链表 · 2.3.3~2.3.6 双链表、循环链表与静态链表