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

一句话记忆

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

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

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

相关推荐
JieE21219 小时前
LeetCode 101. 对称二叉树|JS 递归 + 迭代双解法,彻底搞懂镜像判断
javascript·算法
JieE2122 天前
LeetCode 56. 合并区间|超清晰 JS 图解思路,面试高频区间题
javascript·算法·面试
Jack202 天前
HarmonyOS开发中错误处理策略:网络异常统一处理
算法
小小杨树2 天前
读懂色彩:拍照调色不再难
算法·计算机视觉·配色
JieE2123 天前
LeetCode 226. 翻转二叉树|JS 递归超详细拆解,二叉树入门经典题
javascript·算法
JieE2123 天前
LeetCode 104. 二叉树的最大深度|递归思路超详细拆解
javascript·算法
vivo互联网技术3 天前
CVPR 2026 | 全新强化学习框架 BeautyGRPO:重塑真实人像
算法·大模型·cvpr·影像
Darling噜啦啦3 天前
列表转树算法深度解析:从 Map 到 Reduce 的两种实现,面试高频考点
数据结构·算法·面试
用户497863050733 天前
(一)小红的数组操作
算法·编程语言