【数据结构】顺序表 vs 链表的对比与选择

考点频率 :★★★★★(数据结构必考,选择题年年出现,常以对比表格形式考查)

难度 :⭐⭐

建议:重点记住两者的核心差异(随机访问 vs 顺序访问、连续存储 vs 链式存储),能根据场景判断应该选择哪种结构

1️⃣ 为什么需要对比?

前面几篇文章分别讲了顺序表(数组)和链表(单链表、双向链表、循环链表)。它们都能存储线性数据,但各自的优劣势完全不同------没有绝对的好坏,只有"合不合适"。

在软考中,最常见的考法是:给一个应用场景,问你最适合使用哪种存储结构。 这要求你理解两种结构在"查找、插入、删除、空间占用"四个维度的表现差异,并能根据场景特征(如操作频率、数据量、内存限制)做出判断。

2️⃣ 全景对比表(重点,需熟记)

对比维度 顺序表(数组) 单链表 双向链表
存储方式 连续内存 零散内存(指针链接) 零散内存(双向指针)
随机访问 ✅ O(1)O(1)O(1) ❌ O(n)O(n)O(n) ❌ O(n)O(n)O(n)
按值查找 O(n)O(n)O(n)(无序)/ O(log⁡n)O(\log n)O(logn)(有序) O(n)O(n)O(n) O(n)O(n)O(n)
插入(已知位置) ❌ O(n)O(n)O(n)(需移动元素) ✅ O(1)O(1)O(1)(修改指针) ✅ O(1)O(1)O(1)(修改指针)
删除(已知位置) ❌ O(n)O(n)O(n)(需移动元素) ❌ O(n)O(n)O(n)(需找前驱) ✅ O(1)O(1)O(1)(通过 prev
插入/删除(未知位置) O(n)O(n)O(n)(查找+移动) O(n)O(n)O(n)(查找+修改指针) O(n)O(n)O(n)(查找+修改指针)
存储密度 高(1.0) 低(约0.5,有指针开销) 更低(两个指针开销)
缓存友好性 高(连续内存,CPU缓存命中率高) 低(节点分散,缓存命中率低)
内存分配方式 静态分配(需预知最大容量)或动态扩容(拷贝开销大) 动态分配(按需分配,无浪费) 动态分配

3️⃣ 六维深度解读

3.1 存储方式

  • 顺序表:物理连续,逻辑相邻即物理相邻。就像电影院的一排连座,座位号都是连续的。
  • 链表:物理分散,逻辑相邻不代表物理相邻。每个节点通过指针"记住"下一个节点的位置。

3.2 访问方式

  • 顺序表 :支持随机访问 ,直接通过下标 O(1)O(1)O(1) 获取任意元素。这是它最大的优势。
  • 链表 :只支持顺序访问 ,要访问第 iii 个元素,必须从头开始逐个遍历,时间复杂度 O(n)O(n)O(n)。

3.3 插入与删除

  • 顺序表 :插入或删除元素时,需要移动大量后续元素,平均移动 n/2n/2n/2 个元素,时间复杂度 O(n)O(n)O(n)。
  • 单链表 :插入 O(1)O(1)O(1),删除需先找前驱 O(n)O(n)O(n)。只有在已知前驱节点 的情况下,删除才是 O(1)O(1)O(1)。
  • 双向链表 :插入 O(1)O(1)O(1),删除已知节点时通过 prev 直接找到前驱,也是 O(1)O(1)O(1),无需遍历。

3.4 空间利用率(存储密度)

  • 存储密度 = 数据本身占用的空间 / 节点总占用空间
  • 顺序表:存储密度 ≈ 1(只有数据,无额外开销)
  • 单链表:存储密度 ≈ 0.5(每个节点多一个指针,64位系统占8字节)
  • 双向链表:存储密度更低(两个指针,占16字节)

注意 :链表虽然存储密度低,但不会浪费内存------需要多少就分配多少。顺序表可能因为预先分配了过大的容量而浪费内存。

3.5 CPU缓存友好性

  • 顺序表:连续存储,CPU加载一个数据时,会把相邻的数据也一起加载到缓存中(空间局部性),后续访问速度极快。
  • 链表:节点分散在内存各处,CPU缓存难以预加载,每次访问都可能缓存未命中,效率较低。

3.6 内存分配方式

  • 顺序表:需要预先分配连续空间。如果容量不够,需要重新分配更大的空间并拷贝所有元素,开销大。
  • 链表:按需分配,每次只分配一个节点的大小,不会浪费,也不会出现"容量不够"的问题。

4️⃣ 场景选择指南(软考高频应用题)

场景特征 推荐结构 理由
频繁按下标访问 顺序表 随机访问 O(1)O(1)O(1)
频繁在表尾插入/删除 顺序表 表尾操作 O(1)O(1)O(1)
频繁在表头/中间插入/删除 链表 插入/删除不需要移动元素
元素个数未知、动态变化 链表 动态分配,无容量限制
内存空间有限、需要高存储密度 顺序表 存储密度高,无指针开销
需要双向遍历 双向链表 支持前驱和后继访问
实现循环队列、约瑟夫环 循环链表 首尾相连,自然支持循环逻辑
数据量小、操作简单 顺序表 实现简单,代码量少

5️⃣ 经典例题

例题1:某系统需要频繁在表头插入和删除元素,且元素个数动态变化,无法预知最大容量。最适合采用的存储结构是( )。

A. 顺序表

B. 单链表

C. 数组

D. 哈希表

解析 :表头频繁插入/删除 → 链表插入/删除 O(1)O(1)O(1),顺序表需要移动所有元素 O(n)O(n)O(n);元素个数动态变化 → 链表按需分配,顺序表需要预分配容量。选 B


例题2:某系统需要存储 100 万个学生的成绩,主要操作是按学号(下标)快速查找成绩,很少进行插入和删除。最适合采用的存储结构是( )。

A. 顺序表

B. 单链表

C. 双向链表

D. 循环链表

解析 :按下标快速查找 → 顺序表随机访问 O(1)O(1)O(1);很少插入删除 → 顺序表的劣势不影响。选 A


例题3 (判断):单链表在表头插入元素的时间复杂度为 O(n)O(n)O(n)。( )

解析 :错误。单链表在表头插入元素,只需修改头指针和新节点的 next,时间复杂度为 O(1)O(1)O(1)。

6️⃣ 记忆口诀

顺序连续查得快,插入删除要搬砖。

链表零散改得快,查找必须从头来。

表头表尾频繁动,链表是你不二选。

下标访问很频繁,顺序表里最舒坦。

7️⃣ 小测验(评论区对答案)

某系统需要实现一个"最近浏览记录"功能,用户每次浏览新页面时,将新记录插入到列表的最前面,并删除列表末尾的旧记录(保持记录数不超过 10 条)。该功能对查找操作要求不高。最适合采用的存储结构是( )。

A. 顺序表

B. 单链表

C. 双向链表

D. 哈希表

🔔 本专栏日更,点击头像 → 专栏《软考中级高频考点》订阅,第一时间接收新内容

#软考中级 #软件设计师 #顺序表 #链表 #数据结构对比 #软考备考

相关推荐
布莱克6053 分钟前
链表详解:定义、作用、应用场景及与数组的区别(C/C++ 实战)
c语言·开发语言·c++·链表
鹿角片ljp18 分钟前
LeetCode 141. 环形链表|从 HashSet 到快慢指针 O (1) 空间最优解
算法·leetcode·链表
Z59981784128 分钟前
c#软件开发学习笔记--WPF(Canvas、数据绑定、MVVM模式、值转换器)
笔记·学习·c#
茯苓gao28 分钟前
从零开发 EtherCAT 主站(六):SOEM 初始化流程详解,主站是如何发现所有从站的?
笔记·嵌入式硬件·学习·信息与通信
老当益壮梁奶奶40 分钟前
Linux软件编程学习笔记(九):消息队列、共享内存与信号灯详解
linux·c语言·笔记·学习
从零开始的嵌入式之旅1 小时前
day33
linux·c语言·经验分享·笔记·嵌入式硬件
小星星闪亮登场2 小时前
图论--最小生成树(内含二分图)
数据结构·算法·图论·迭代加深·图搜索算法
一条破秋裤2 小时前
STM32 学习笔记:STM32 简介与学习路线
笔记·stm32·学习
浔溺2 小时前
al+大数据每日学习笔记27
笔记·学习
2601_962201723 小时前
Java进阶,集合,Colllection,常见数据结构
java·数据结构·windows