有序线性表删除一个元素:顺序存储 vs 单链表,平均要移动多少个元素?

一道经典的数据结构考题,背后藏着两种存储结构的本质差异。今天我们用最直观的方式把它讲透。

今天我们来聊一道数据结构里的"老熟人":

设有一个包含 n 个元素的有序线性表。在等概率情况下删除其中的一个元素,若采用顺序存储结构,则平均需要移动( )个元素;若采用单链表存储,则平均需要移动( )个元素。

这道题看似简单,但很多同学容易混淆。我们今天就彻底搞清楚:为什么顺序存储要移动一堆元素,而单链表几乎不用动?


一、先上答案

  • 顺序存储(数组) :平均需要移动 (n-1)/2 个元素。
  • 单链表存储 :平均需要移动 0 个元素。

注意:题目问的是"移动元素",而不是"查找元素"。查找的时间不计入"移动"。


二、顺序存储(数组)------ 删除一个元素,后面全得往前挪

2.1 为什么会移动?

顺序存储用一段连续的内存空间存放数据。删除下标为 i 的元素后,为了保持顺序表的物理连续性 ,必须把 i+1n-1 的所有元素逐个向前移动一个位置

2.2 移动次数与删除位置的关系

假设表长为 n,元素下标从 0 到 n-1。

  • 删除最后一个元素(下标 n-1):不需要移动任何元素 → 移动 0 次。
  • 删除第一个元素(下标 0):需要把后面 n-1 个元素全部前移 → 移动 n-1 次。
  • 删除下标为 i 的元素:需要移动 (n-1 - i) 个元素。

2.3 等概率下的平均移动次数

每个位置被删除的概率都是 1/n。

平均移动次数 =
1n∑i=0n−1(n−1−i) \frac{1}{n} \sum_{i=0}^{n-1} (n-1-i) n1i=0∑n−1(n−1−i)

令 k=n−1−ik = n-1-ik=n−1−i,则 kkk 从 n−1n-1n−1 到 000 求和:
1n∑k=0n−1k=1n⋅n(n−1)2=n−12 \frac{1}{n} \sum_{k=0}^{n-1} k = \frac{1}{n} \cdot \frac{n(n-1)}{2} = \frac{n-1}{2} n1k=0∑n−1k=n1⋅2n(n−1)=2n−1
结论 :平均移动 (n-1)/2 个元素。

2.4 举个例子(n=5)

表:[10, 20, 30, 40, 50]

删除位置 移动次数 移动的元素
0 (10) 4 20,30,40,50
1 (20) 3 30,40,50
2 (30) 2 40,50
3 (40) 1 50
4 (50) 0

平均 = (4+3+2+1+0)/5 = 10/5 = 2,而 (n-1)/2 = 4/2 = 2,一致。


三、单链表存储 ------ 删除一个元素,只需要改指针

3.1 为什么移动次数为 0?

链表的元素在内存中是离散分布的,通过指针链接。删除一个节点时,我们只需要:

  1. 找到被删节点的前驱节点。
  2. 让前驱节点的 next 指针指向被删节点的 next
  3. (可选)释放被删节点的内存。

整个过程没有移动任何元素的数据 ,只是修改了几个指针的值。所以移动元素的个数为 0

3.2 注意:题目问的是"移动元素",不是"查找"

有人可能会问:"那查找被删节点不是要遍历吗?"

题目明确问的是移动元素,不是比较或访问。链表的删除操作本身不需要把任何元素从一个内存位置搬到另一个位置,因此移动次数恒为 0。

3.3 特殊情况验证

  • 删除第一个节点:修改头指针 → 0 移动。
  • 删除最后一个节点:让倒数第二个节点的 next 指向 None → 0 移动。
  • 删除中间节点:修改前驱的 next → 0 移动。

无论哪种情况,都不需要移动其他节点的数据。


四、一道题,两种思维

存储结构 删除时是否需要移动元素 平均移动次数 时间复杂度(含查找)
顺序表(数组) (n-1)/2 O(n)(移动 + 查找)
单链表 0 O(n)(主要是查找,删除本身 O(1))

关键区别

  • 顺序表牺牲插入/删除的效率,换取随机访问的高效(O(1) 下标访问)。
  • 链表牺牲随机访问,换取插入/删除的高效(无需移动数据)。

五、延伸思考:如果问的是"平均时间复杂度"呢?

如果题目改成"平均时间复杂度",那么:

  • 顺序表:删除需要先查找(有序表可以用二分查找 O(log n)),然后移动元素 O(n)。所以平均时间复杂度为 O(n)(移动占主导)。
  • 单链表:查找需要从头遍历 O(n),删除本身 O(1)。所以平均时间复杂度也是 O(n)(查找占主导)。

但本题明确问"平均需要移动几个元素",所以顺序表是 (n-1)/2,链表是 0。


六、总结

填空题答案

  • (1) (n-1)/2
  • (2) 0

一句话记忆

顺序存储删除像"拖家带口"------删一个,后面全得挪;

链式存储删除像"过河拆桥"------改个指针,万事大吉。

希望这篇文章能帮你彻底理解这道经典考题。如果觉得有用,欢迎点赞、收藏、转发~

相关推荐
2601_962218615 小时前
万象生鲜系统业财一体化底层打通技术自动生成经营账单
大数据·数据库·人工智能·python·算法
吞下星星的少年·-·5 小时前
The 2026 ICPC Asia East Continent Online Contest (II)(构造)
数据结构·算法
stolentime7 小时前
洛谷P10515 转圈题解
c++·算法·数学建模·贪心算法
和裕8 小时前
蜂窝板 vs 七层瓦楞重型纸箱:大件工业设备运输性能与成本全对比
大数据·运维·网络·人工智能·算法
衡石科技8 小时前
Data_Agent记忆机制与经验复用衡石分析智能体会话记忆与长期学习技术解析
人工智能·科技·学习·算法·企业级bi
Msshu1239 小时前
2~5串锂电快充优选|XSP36 Type‑C升压/升降压快充管理芯片
数据结构·随机森林·贪心算法·排序算法·线性回归·启发式算法
shirsl9 小时前
算法 Day 2 滑动窗口 + 栈 / 单调栈
开发语言·python·算法
土司大王10 小时前
LeetCode hot100 回溯专题总结:Java 通用模板、决策树模型
java·算法·leetcode·决策树
2601_9622186110 小时前
万象生鲜系统订单全生命周期状态同步技术实现业务可视
大数据·数据库·人工智能·python·算法
那年窗外下的雪.11 小时前
AIDC 学习日志|第 22 天|All-Active/Single-Active 故障演练设计
服务器·网络·学习·算法·哈希算法