已知长度为n的线性表A采用顺序存储结构,请写一时间复杂度为O(n)、空间复杂度为O(1)的算法,该算法删除线性表中所有值为item的数据元素。
时间: 2024-10-28 15:08:45 浏览: 48
《数据结构》面授辅导资料
要实现这个操作,你可以遍历整个线性表,同时使用一个布尔变量跟踪当前元素是否等于`item`。如果找到等于`item`的元素,就跳过它,否则将其移动到当前位置并更新指针。由于我们需要遍历每个元素一次,所以时间复杂度是O(n)。空间复杂度保持为O(1),因为我们只用到了常数级别的额外空间。
以下是一个简单的C++实现:
```cpp
#include <iostream>
// 假设线性表的类型是int,但可以根据实际数据类型替换
void removeItem(int* A, int n, int item) {
if (A == nullptr || n <= 0) return; // 如果数组为空或长度为0,直接返回
int index = 0; // 初始化索引为0
for (int i = 0; i < n; ++i) {
if (A[i] != item) { // 找到不等于item的元素
A[index++] = A[i]; // 将其移到正确的位置并更新索引
}
}
// 将剩余位置置为0,表示已经删除了所有item
while (index < n) {
A[index++] = 0;
}
// 更新数组的实际大小,移除尾部多余的零
n = index;
// 显示新的数组长度,以确认删除操作
std::cout << "After removing all items, the length of the array is: " << n << std::endl;
}
// 测试示例
int main() {
int A[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
int n = sizeof(A) / sizeof(A[0]);
int item = 5;
removeItem(A, n, item);
return 0;
}
```
阅读全文