L2-002 链表去重

超详解析,手打不易,转载注明出处,点赞收藏,多谢支持

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>

struct LNode{
    long data;              //当前键值
    long next_address;      //下一个结点地址
}LNodes[100001];

int main(){
    long head = -1;    //去重后的链表起始结点
    long del = -1      //被删除的链表起始结点
    long n;
    int Num[100001] = {0};  // 0 代表未出现该键值 数组下标代表键值
    
    scanf("%ld %ld",&head,&n);
    
    for(int i=0;i<n;i++){   //输入
        long address; 
        scanf("%ld",&address);
        scanf("%ld %ld",&LNodes[address].data,&LNodes[address].next_address);
    }
    
    long p_head = head;
    long H_tail = -1;   //去重后的链表 最后的地址
    long D_tail = -1;   //被删除后的链表 最后的地址
    
    while(p_head != -1){
        long i = LNodes[p_head].data;
        if(!Num[abs(i)]){   //查看 键值 是否已出现过  abs():取绝对值函数
            Num[abs(i)] = 1;    //没出现,则质1,代表出现
            if(H_tail != -1)    //为去重后的链表上一个结点的下一个结点地址赋值当前结点地址
                LNodes[H_tail].next_address = p_head;
            H_tail = p_head;    //使去重后的链表的最后结点为当前结点
        }else{
            if(D_tail != -1)    //为被删除后的链表上一个结点的下一个结点地址赋值当前结点地址
                LNodes[D_tail].next_address = p_head;
            if(D_tail == -1)del = p_head;   //若被删除后的链表为空,则头结点地址为当前地址
            D_tail = p_head;    //使被删除后的链表的最后结点为当前结点
        }
        p_head = LNodes[p_head].next_address;   //下一个结点
    }
    //使两个链表最后结点的下一个结点地址为-1
    LNodes[H_tail].next_address = -1;
    LNodes[D_tail].next_address = -1;
    //打印输出
    while(head != -1){
        printf("%05ld %ld",head,LNodes[head].data);
        printf(LNodes[head].next_address!=-1?" %05ld\n":" %ld\n",LNodes[head].next_address);
         head = LNodes[head].next_address;
    }
    while(del != -1){
        printf("%05ld %ld",del,LNodes[del].data);
        printf(LNodes[del].next_address!=-1?" %05ld\n":" %ld\n",LNodes[del].next_address);
        del = LNodes[del].next_address;
    }
}



  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值