对长度为n的顺序表L,编写一个时间复杂度为O(n),空间复杂度为O(1)的算法,该算法删除线性表中所有值为x的数据元素。
- 解法一:用两个指针同时从头开始遍历顺序表,p指针用来判断当前元素是都需要留下来,如果需要留下来,就覆盖到q指针当前所指的位置,如果需要删除,则忽略当前元素,p指针指向下一个结点,再次重复这个步骤。
- 因为这个顺序表是需要丢弃一部分的,所以p指针一定会走在q指针的前面,当p指针指到最后一个元素且判断之后结束。
- 解法二:用k记录需要留下的元素的个数,遍历时将不等于x的元素覆盖到下标为k的位置,并更新k的值。
- 这个k又充当下标,又记录长度,真是妙啊。
#include <stdio.h>
#define maxsize 50
typedef int ElemType;
typedef struct{
ElemType data[maxsize];
int length;
}SqList;
void Delete(SqList &L, ElemType e)
{
int k = 0, i;
for(i=0; i<L.length; i++)
{
if(L.data[i]!=e){
L.data[k] = L.data[i];
k++;
}
}
L.length = k;
}
int main() {
SqList L;
L.data[0] = 1;
L.data[1] = 2;
L.data[2] = 3;
L.data[3] = 4;
L.data[4] = 1;
L.data[5] = 2;
L.data[6] = 3;
L.data[7] = 4;
L.data[8] = 1;
L.data[9] = 2;
L.length = 10;
Delete(L,1);
for(int i = 0; i<L.length; i++)
{
printf("%d ", L.data[i]);
}
return 0;
}