考研数据结构(每日一题)
题目:对长度为n的顺序表L,编写一个时间复杂度为O(n),空间复杂度为O(1)的算法,将算法删除线性表中所有值为x的数据元素。
算法图解:
算法思想:
分析:O(n):扫描一次顺序表 O(1):申请常数个辅助空间 找到线性表中值为x的元素,再将其删除(移动),就是将后面的依次移动到前面。
思想:扫描顺序表,记录其中x的个数,用k表示,将其中不是x的元素向前移动k个单位
完整代码:
核心代码:
if(L.data[i] == x){ //若找到x 的值
k++; //k加1
}else{
L.data[i-k] = L.data[i]; //向前移动k个单位
i++;
}
完整代码:
void Del_x(Sqlist &L,Elemtype x){
int i = 0;
while(i < L.length){
int k = 0;
if(L.data[i] == x) //若找到x 的值
{
k++; //k加1
}else{
L.data[i-k] = L.data[i]; //向前移动k个单位
i++;
}
}
L.length = L.length - k; //链表长度
}