一道经典的数据结构考题,背后藏着两种存储结构的本质差异。今天我们用最直观的方式把它讲透。
今天我们来聊一道数据结构里的"老熟人":
设有一个包含 n 个元素的有序线性表。在等概率情况下删除其中的一个元素,若采用顺序存储结构,则平均需要移动( )个元素;若采用单链表存储,则平均需要移动( )个元素。
这道题看似简单,但很多同学容易混淆。我们今天就彻底搞清楚:为什么顺序存储要移动一堆元素,而单链表几乎不用动?
一、先上答案
- 顺序存储(数组) :平均需要移动 (n-1)/2 个元素。
- 单链表存储 :平均需要移动 0 个元素。
注意:题目问的是"移动元素",而不是"查找元素"。查找的时间不计入"移动"。
二、顺序存储(数组)------ 删除一个元素,后面全得往前挪
2.1 为什么会移动?
顺序存储用一段连续的内存空间存放数据。删除下标为 i 的元素后,为了保持顺序表的物理连续性 ,必须把 i+1 到 n-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?
链表的元素在内存中是离散分布的,通过指针链接。删除一个节点时,我们只需要:
- 找到被删节点的前驱节点。
- 让前驱节点的
next指针指向被删节点的next。 - (可选)释放被删节点的内存。
整个过程没有移动任何元素的数据 ,只是修改了几个指针的值。所以移动元素的个数为 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
一句话记忆:
顺序存储删除像"拖家带口"------删一个,后面全得挪;
链式存储删除像"过河拆桥"------改个指针,万事大吉。
希望这篇文章能帮你彻底理解这道经典考题。如果觉得有用,欢迎点赞、收藏、转发~