L2-002 链表去重

#include <bits/stdc++.h>
using namespace std;
#define int long long 
using pii=pair<double,double>;

struct node{
    int val;
    int to;
};

int bj[100005];//开数组 利用下标来当索引 省的还要映射



void solve()
{
    node a[100005];
    int st,n;
    cin>>st>>n;
    
    while(n--)
    {
        int id,val,to;
        cin>>id;
        cin>>a[id].val>>a[id].to;
    }
    
    int p=st;//工作指针
    int tmp=0;
    int flag=-888;//用来判断首次出现重复的下标,并作为重复链表的更新索引
    int dt=-888;//记录重复链表的链头下标
    

    
    while(p!=-1)
    {
        if(!bj[abs(a[p].val)]){
            bj[abs(a[p].val)]=1;
            tmp=p; //记得更新前置结点
        }else{
            a[tmp].to=a[p].to;//指向当前结点的下一个结点,完成更新
            if(flag==-888){
                dt=p;
            }else{
                a[flag].to=p;//指向当前结点的下一个结点,完成更新
            }
            flag=p;//记得更新前置结点
            
        }
        p=a[p].to;
    }
    a[flag].to=-1;//处理链表尾部
    a[tmp].to=-1;//同理

    
    while(st!=-1){
    if(a[st].to!=-1)    cout<<setfill('0')<<setw(5)<<st<<" "<<a[st].val<<" "<<setfill('0')<<setw(5)<<a[st].to<<"\n";
    else  cout<<setfill('0')<<setw(5)<<st<<" "<<a[st].val<<" "<<a[st].to<<"\n";
        st=a[st].to;
    }
   
   while(dt!=-1&&dt!=-888){//这个要有重复链表再输出 不然就会超时 所以会多一个条件
       if(a[dt].to!=-1) cout<<setfill('0')<<setw(5)<<dt<<" "<<a[dt].val<<" "<<setfill('0')<<setw(5)<<a[dt].to<<"\n";
       else cout<<setfill('0')<<setw(5)<<dt<<" "<<a[dt].val<<" "<<a[dt].to<<"\n";
        dt=a[dt].to;
    }
}




signed main()
{
    int t=1;
  //  cin>>t;
    while(t--) solve();
    
    
}

posted on 2025-04-02 20:28  swj2529411658  阅读(24)  评论(0)    收藏  举报

导航