Appearance
题目
当存储空间有足够的空闲空间时,在保持表内元素顺序相对不变的情况下,下列哪些操作会必然导致产生移动次数()。
I. 表头插入一个元素
II. 表头删除一个元素
III. 表尾插入一个元素
IV. 表尾删除一个元素
错因
B
正确识别了"表头插入"要移动,但把"表尾插入"也算上了。把"顺序表插入" 笼统地等同于"要搬动元素",没分清楚位置:表尾插入只是把新元素写到下标 length 处,length 自增,前面的元素一个都不用动。
C
把"删除"无脑地等同于"要移动",把表尾删除也算上了。表尾删除只需 length--,被删的位置后续会被新元素覆盖,逻辑上等同于"扔掉",没有任何元素需要前移。
D
判断方向完全反了。可能是把"链表"的特性套到了顺序表上——链表是表头插入/删除 O(1)、要插表尾或修改表尾才麻烦;但顺序表恰好相反,越靠表头代价越大。混淆了两种存储结构。
总解析
核心:顺序表把元素紧密连续存放在数组下标 0…length-1 上。当向第 i 位插入/删除时,必须把 [i, length-1] 这段元素整体后移或前移一格,移动的元素数 = 受影响区间的长度。
逐个核对:
- I 表头插入:插入位置 i = 0,需把 [0, length-1] 全部后移一格 → 移动 length 次。必然移动。
- II 表头删除:删除位置 i = 0,需把 [1, length-1] 全部前移一格 → 移动 length-1 次。必然移动。
- III 表尾插入:插入位置 i = length,新元素直接写到 a[length],length++ → 0 次移动。
- IV 表尾删除:直接 length-- 即可,原 a[length-1] 被"忽略"(下次写入时被覆盖)→ 0 次移动。
所以"必然产生移动"的是 I 和 II。
最终答案是 A。