题目描述:从有序顺序表中删除所有其值重复的元素,使其中所有元素的值均不同
算法思想:
输入检查:若顺序表为空或指针为空,返回false。
双指针覆盖法:
使用指针k标记保留元素的末尾,初始位置为0。
遍历顺序表(从i=1开始),若当前元素data[i]不等于data[k],则将其保留到k+1位置,并更新k。
更新表长:遍历结束后,表长设为k+1,直接截断后续元素。
复杂度分析:时间复杂度O(n)空间复杂度O(1)
代码实现:
#include <stdbool.h>
#define MAXSIZE 100 // 假设顺序表最大容量
typedef struct {
int data[MAXSIZE];
int length;
} SeqList;
bool DeleteDuplicates(SeqList *L) {
// 检查空指针或空表
if (L == NULL || L->length == 0) {
return false;
}
int k = 0; // 保留元素的末尾索引
for (int i = 1; i < L->length; i++) {
// 若当前元素与前一个保留元素不同,则保留
if (L->data[i] != L->data[k]) {
L->data[++k] = L->data[i]; // 先递增k,再赋值
}
}
L->length = k + 1; // 新表长为k+1
return true;
}