单链表中删除相等的多余结点
2020-04-09 本文已影响0人
SK_Wang
用单链表保存m个整数, 结点的结构为(data,link),且|data|<=n(n为正整数). 现在要去设计一个时间复杂度尽可能高效的算法. 对于链表中的data 绝对值相等的结点, 仅保留第一次出现的结点,而删除其余绝对值相等的结点.
示例:
输入:0->2->-2->6->2->10
输出:0->2->6->10
解题思路:
- 申请大小为n+1的辅助数组t并赋值初值为0;
- 从首元结点开始遍历链表,依次检查t[|data|]的值
-- 若[|data|]为0,即结点首次出现,则保留该结点,并置t[|data|] = 1
-- 若t[|data|]不为0,则将该结点从链表中删除.
代码:
typedef struct Node{
int data;
struct Node *next;
} Node;
typedef struct Node * LinkList;
void DeleteEqualNode(LinkList *L, int n) {
int *p = malloc(sizeof(int) * n);
for (int i = 0; i < n; i++) {
p[i] = 0;
}
LinkList q = *L;
LinkList r = (*L)->next;
while (r) {
if (p[abs(r->data)] == 1) {
q->next = r->next;
free(r);
r = q->next;
} else {
p[abs(r->data)] = 1;
q = r;
r = r->next;
}
}
}