【数据结构】顺序表 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. 哈希表

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

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

相关推荐
wabs66611 小时前
关于图论【最短路径之Dijkstra算法(堆优化版)|卡码网47.参加科学大会的思考】
数据结构·算法·图论·优先级队列·邻接表·小顶堆·卡码网
果果燕11 小时前
实习笔记(一):NFS、Samba、VNC、Git、CMake、systemd、内核、交叉编译
linux·arm开发·c++·笔记·git
Zguigo13 小时前
第25-26讲:计算机操作系统存储管理——分页机制、页表与快表(TLB)
linux·windows·笔记
爱音乐的marlon13 小时前
FastAPI 学习笔记03|core 核心层:config 是总控制台,database 是整个工程的地基
笔记·学习·fastapi
evans在进步15 小时前
LeetCode 2 两数相加:链表模拟加法,Java 图解进位过程
java·leetcode·链表
yyy(十一月限定版)15 小时前
016【入门】双端队列
数据结构·c++
白狐_79815 小时前
408数据结构:中缀转后缀与操作符栈容量——真题精讲
前端·javascript·数据结构
疯狂打码的少年16 小时前
【数据结构】链表变体:双向链表与循环链表
数据结构·笔记·链表
iCxhust16 小时前
二进制文件编辑器ImHex安装步骤
笔记·微机原理·8088单板机