题目描述:从顺序表中删除其值在给定值s与t之间(包含s和 t,要求 s<t)的所有元素,若s或t不合理或顺序表为空,则返回 false,若执行成功则返回 true。
算法思想:
输入检查:若顺序表为空、指针为空或 s >= t,直接返回 false。
双指针覆盖法:用 k 记录保留元素的索引,i 遍历原数组。若元素不在 [s, t] 内,将其保留到 k 位置,k 递增。
更新表长:遍历结束后,表长设为 k,实现原地删除。
复杂度分析:时间复杂度O(n)空间复杂度O(1)
代码实现:
cpp
#include <stdbool.h>
#define MAXSIZE 100 // 假设顺序表最大容量
typedef struct {
int data[MAXSIZE];
int length;
} SeqList;
bool DeleteBetweenSAndT(SeqList *L, int s, int t) {
// 检查输入合法性:空指针、空表、s>=t
if (L == NULL || L->length == 0 || s >= t) {
return false;
}
int k = 0; // 记录保留元素的索引
for (int i = 0; i < L->length; i++) {
// 若元素不在[s, t]内,则保留
if (L->data[i] < s || L->data[i] > t) {
L->data[k++] = L->data[i];
}
}
L->length = k; // 更新表长为保留元素的数量
return true;
}