对于长度为n的线性表,编写一个时间复杂度为O(n)、空间复杂度为O(1)的算法,算法删除线性表中所有值为e的数据元素。
void del_x(sqList* L,ElemType x){
int pos=0;
while(pos<L.length){
if(L[pos]!=x){
pos++;
}
else{
L[pos]=L[L.length-1];
L.length-=1;
}
}
}
//这个方法是我自己写的,不稳定,将顺序表中的数据顺序改变了
// 王道书上给的三种解法都很不错,值得借鉴
// SOLUTION1 用k记录顺序表L中不等于e的数据元素个数,扫描时将等于e的元素移动到下标k的位置,并更新k值,扫描结束后修改顺序表的长度。
void del_x_1(sqList* L,ElemType e){
int k=0;
for(int i=0;i<L.length;i++){
if(L.data[i]!=e){
L.data[k++]=L.data[i];
}
}
L.length=k;
}
//SOLUTION2 用k记录顺序表中等于e的元素个数,边扫描边统计k,并将不等于e的元素左移k个位置,扫描结束后修改L的长度。
void del_x_2(sqList* L,ElemType e){
int k=0;
for(int i=0;i<L.length;i++){
if(L.data[i]!=e){
L.data[i-k]=L.data[i];
}
else{
k++;
}
}
L.length-=k;
}
//SOLUTION3 双指针,跟自己写的差不多 ,我是使用的长度作为右指针,每次遇见就将长度减少1
void del_x_3(sqList *L ,ElemType e){
int left=0,right=L.length-1;
while(left<right){
if(L.data[left]==e){
L.data[left]=L.data[right];
right--;
}
else{
left++;
}
}
}