题目要求:
对长度为n的顺序表L,编写一个时间复杂度为O(n),空间复杂度为O(1)的算法,该算法删除顺序表中所有为e的数据元素
正好今天上实验课,顺便写写吧!
这个目前想出来3个方法
方法一 就是用一个变量来代替记录不是e的元素个数
void way1(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];
k++;
}
}
L.length = k;
}
方法二 就是用一个变量来代替记录是e的元素个数
void way2(Sqlist &L,ElemType e){
int k =0,i=0;
while(i<L.length){
if(L.data[i]==e)
k++;
else
L.data[i-k]=L.data[i];
i++;
}
L.length = L.length-k;
}
方法三就是双指针直接,但是有一个问题就是它破坏了原本的顺序
void way3(Sqlist &L,Elemtype e){
int left = 0,right = L.length-1,n=0;
while(left>=right){
if(L.data[left]==e){
L.data[left]=L.data[right]
right--;
n++;
}
else
{
left++;
}
}
L.length = L.length-n;
}