已知长度为n的线性表L采用顺序存储结构 (定义如下),编写一个时间复杂度为O(n)、空间复杂度为O(1)的算法,该算法删除线性表中所有值为x的数据元素。 typedef structi ElemType *elem; int length; }SqList;
时间: 2024-09-17 14:04:25 浏览: 44
对于给定的顺序存储结构线性表 `SqList`,要在时间复杂度为 O(n),空间复杂度为 O(1) 的情况下删除所有值为 x 的数据元素,可以遍历整个列表,同时使用两个指针,一个记录当前位置,另一个记录新列表的结束位置。以下是算法步骤:
1. 初始化两个指针,`pStart` 指向列表开始,`pNext` 初始设为 `NULL`。
2. 遍历列表:
- 如果当前元素 `L->elem[pStart].elem` 不等于 x,将它复制到新位置,并移动 `pNext` 指针。
- 如果当前元素等于 x,则跳过它,不做任何操作。
3. 当遍历完原列表后,如果 `pNext` 不为 `NULL`,说明还有新的非 x 元素,更新 `L->length` 为 `pNext - L->elem`,并设置 `L->elem[L->length] = NULL` 表示结束。
4. 返回处理后的列表。
```c++
void delete_x(SqList *L, int x) {
if (L == NULL || L->length == 0) return;
int pStart = 0, pNext = 0;
while (pNext < L->length) {
if (L->elem[pStart].elem != x) {
L->elem[pNext++] = L->elem[pStart];
}
pStart++;
}
// 裁剪多余的 NULL 元素
L->length = pNext;
if (pNext > 0) {
L->elem[L->length] = NULL;
} else {
free(L); // 如果列表为空,释放内存
L = NULL;
}
}
```
阅读全文