有序线性表删除一个元素:顺序存储 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

一句话记忆

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

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

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

相关推荐
IT大白鼠3 小时前
AIGC性能的关键瓶颈:算力、数据、算法三者如何互相制约?
算法·aigc
白雪茫茫4 小时前
监督学习、半监督学习、无监督学习算法详解
python·学习·算法·ai
FengyunSky4 小时前
浅析 空间频率响应 SFR 计算
算法
树下水月4 小时前
PHP 一种改良版的雪花算法
算法·php·dreamweaver
一只数据集5 小时前
全尺寸人形机器人灵巧手力觉触觉数据集-2908条ROSbag数据覆盖14大应用场景深度解析
大数据·人工智能·算法·机器人
罗西的思考6 小时前
【GUI-Agent】阿里通义MAI-UI 代码阅读(2)--- 实现
人工智能·算法·机器学习
流年如夢6 小时前
单链表进阶版 -->双向链表
数据结构·链表
刀法如飞7 小时前
TypeScript 数组去重的 20 种实现方式,哪一种你还不知道?
前端·javascript·算法
流年如夢8 小时前
单链表 -->增、删、查、改等详细操作
c语言·数据结构
sali-tec8 小时前
C# 基于OpenCv的视觉工作流-章66-直线夹角
图像处理·人工智能·opencv·算法·计算机视觉