题目要求:给定一个单链表,所有的数都不超过n,设计一个高效的算法,删除绝对值相同的元素,只保留第一个出现的节点。
算法思想:
已知每个数都不超过n,所以可以考虑用空间换时间,申请一个n+1大小的数组,全部赋值为0,表示未使用过,用一个工作指针遍历单链表,并检查q[|data|]的值,如果为零则保留并令q[|data|]=1,如果q[|data|]=1则删除。具体实现代码如下:
void delCommonValue(LinkList& L, int n) {
LNOde* p = L, * r;
int* q, m;
q = (int*)malloc(sizeof(int) * (n + 1)); //申请n+1个位置的辅助空间
for (int i = 0; i < n + 1; i++){
*(q + i) = 0; //数组元素初始值赋值0
}
while (p->next != NULL) {//遍历单链表元素
m = p->next->data > 0 ? p->next->data : -p->next->data; //判断元素的正负
if (*(q + m) == 0) { //判断该节点的data是否出现过
*(q + m) = 1; //第一次出现
p = p->next; //保留
}
else { //重复出现则删除
r = p->next;
p->next = r->next;
free(r);
}
}
free(q);
arrayList(L);
}
测试运行结果如下: