删除线性表中特定值元素

线性表算法题(3)

Posted by HK on September 26, 2020

题目

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

算法思路 1

用k记录顺序表L中不等于x的元素个数(即需要保存的元素个数),边扫描L边统计k,并将不等于x的元素向前移动k个位置,最后修改L的长度。

算法 1

void del_x_1(Sqlist &L,Elemtype x){
	int k=0;						//k记录值不等于x的元素个数
	for(i=0;i<L.length.i++){
		if(L.data[i]!=x){
			L.data[k]=L.data[i];
			k++;					//不等于x的元素值增加1
		}
	}
	L.length=k;						//顺序表的长度
}

算法思路 2

用k记录顺序表L中等于x的元素个数(即需要删除的元素个数),边扫描L边统计k,并将不等于x的元素向前移动k个位置,最后修改L的长度。

算法 2

void del_x_2(Sqlist &L,Elemtype x){
	int k=0;						//k记录值等于x的元素个数
	for(i=0;i<L.length;i++){			
		if(L.data[i]==x){
			k++;
		}
		else
			L.data[i-k]=L.data[i];  //当前元素前移k个位置
	}
	L.length=L.length-k; 			//顺序表L的长度递减
}