单链表中删除相等的多余结点

2020-04-09  本文已影响0人  SK_Wang

用单链表保存m个整数, 结点的结构为(data,link),且|data|<=n(n为正整数). 现在要去设计一个时间复杂度尽可能高效的算法. 对于链表中的data 绝对值相等的结点, 仅保留第一次出现的结点,而删除其余绝对值相等的结点.

示例:

输入:0->2->-2->6->2->10
输出:0->2->6->10

解题思路:

  1. 申请大小为n+1的辅助数组t并赋值初值为0;
  2. 从首元结点开始遍历链表,依次检查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;
        }
    }
}

上一篇下一篇

猜你喜欢

热点阅读