美文网首页
单链表中删除相等的多余结点

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

作者: SK_Wang | 来源:发表于2020-04-09 21:48 被阅读0次

    用单链表保存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;
            }
        }
    }
    
    

    相关文章

      网友评论

          本文标题:单链表中删除相等的多余结点

          本文链接:https://www.haomeiwen.com/subject/xqghmhtx.html