1-10 链表去重

1-10 链表去重,第1张

#include
#include
struct stemp
{
    int data;
    int next;
} x[100005];// 储存数据
int flag[10001]={0};//

int Read();
int abs(int x);
void Print(struct stemp list[],int head)
{
    // printf("开始打印\n");
    int p = head;
    // int i=0;
    while (p != -1)
    {
        if (list[p].next != -1)
            printf("%05d %d %05d\n", p, list[p].data, list[p].next);
        else
            printf("%05d %d %d\n", p, list[p].data, list[p].next);
        p = list[p].next;
        // i++;
    }
}
int main()
{
    //读取
    int head ,p,prev, headDel = -1,tailDel;
    p=head=Read();
    if (head == -1)
    {
        return 0;
    }

    //核心算法,空间复杂度为O(n)
    prev=head;//记录上一个节点地址
    while(p!=-1){
        if(flag[abs(x[p].data)]){
            if(headDel==-1){
                headDel=p;
                tailDel=p;//跟踪
            }
            else{
                x[tailDel].next=p;
                tailDel=p;
            }//这一部分是对删除数据进行处理
            x[prev].next=x[p].next;//对原来的数据进行处理
        }
        else{
            flag[abs(x[p].data)]=1;//该数据已经被访问过
            prev=p;
        }
        p=x[prev].next;
    }
    if(headDel!=-1)x[tailDel].next=-1;
    //核心算法结束
    Print(x,head);
    // printf("测试\n");
    Print(x,headDel);
}
int abs(int x){
    return x>=0?x:-x;
}
int Read()
{
    int head, n;
    scanf("%d %d", &head, &n);
    if (n == 0)
    {
        return -1;
    }
    int addr, data, next;
    for (int i = 0; i < n; i++)
    {
        scanf("%d%d%d", &addr, &data, &next);
        x[addr].data = data;
        x[addr].next = next;
    }
    return head;
}
 

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/2991603.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-09-23
下一篇 2022-09-23

发表评论

登录后才能评论

评论列表(0条)

保存