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) 收藏 举报
浙公网安备 33010602011771号