顺序表删除指定元素


  1. 对长度为n的顺序表L,编写一个时间复杂度为O(n)、空间复杂度为O(1)的算法,该算法删除线性表中所有值为x的数据元素。

  2. 注意删除元素后,不要忘记需要将顺序表后方的元素前移。

1.思路

设置一个变量k用于记录已经删除元素的个数,当遍历到后方的元素时,只需要将该元素向前移动k个位置即可。

image-20230703093348424

2.参考代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include "preset.h"

//listDelete十分巧妙的操作技巧
void listDelete(SqList &sql, int x) {
int k = 0;
for (int i = 0; i < sql.length; ++i) {
if (sql.elem[i] == x) {
k++;
} else {
sql.elem[i - k] = sql.elem[i];
}
}
sql.length = sql.length - k;
}

int main () {
SqList sql = {{1, 7, 2, 1, 4, 1, 6, 5, 1, 9}, 10};
cout << "Current SqList: "; print(sql);
listDelete(sql, 1);
cout << "AfterDeletion : "; print(sql);
return 0;
}