/*假设一个线性表采用顺序表表示,设计一个算法,删除其中所有值等于x的元素,
要求算法的时间复杂度为O(n),空间复杂度为O(1)*/
//从时间复杂度上看只能遍历一次顺序表
//从空间复杂度上看其中设置的临时变量只能是简单变量,不能是表
//所以可以排除的思路有:①每找到一个与x相等的元素都整体移动一次(原因:由于出现嵌套循环,故其时间复杂度至少为O(n^2),空间复杂度为O(1));
//②临时新建一个顺序表存放不等于x的元素(原因:其新建一个顺序表使得空间复杂度为O(n),由于仅需遍历一次顺序表所以其时间复杂度为O(n))
//所以我们就在想能不能找到一个与x元素相等时,就'跳过它',让不等于x的后面元素覆盖其元素位置,依次类推:
//所以就有了以下代码:
void del_equalnode(SqList*& L, ElemType x)
{
int i = 0, k = 0;//k是用来标记没有断片的位置的,i是记录遍历顺序表位置的
for (i = 0; i < L->length; i++)
{
if ((L->data[i] != x)
{
L->data[k] = L->data[i];
k++;
}
}
L->length=k;
}
//代码分析:由于整个过程仅遍历一次顺序表且仅创建了两个临时简单变量,故满足题目的算法要求
//除了以上的思路,还有一种通过遍历得到有多少个与x相等的元素个数决定元素移动的个数,让不等于x的后面元素覆盖其元素位置
//以下是该思路的代码:
void del_equalnode(SqList*& L, ElemType x)
{
int i = 0,k = 0;
while (i<L->length)
{
if (L->data[i] == x)
k++;
else
L->data[i - k] = L->data[i];
i++;
}
L->length -= k;
}
//代码分析:全过程仅变量一次顺序表,其元素移动是有距离k的要求,没有从头重新移动,无新建顺序表,故可以满足题目的算法要求
Respect!!!!!!