测试用例过了,只有一个节点的也过了,多重复测试用例也没问题,剩下纯纯黑盒,完全无从下手。。。你清高,我没时间给你耗了😡(╯▔皿▔)╯
//多重复测试
00100 3
00100 2 00300
00300 2 00400
00400 2 -1
//结果
00100 2 -1
00300 2 00400
00400 2 -1
//静态链表加对应set去重
#include<bits/stdc++.h>
using namespace std;
//const int N = 1e5+5;
typedef struct Node{
int num;
int next;
}ListNode;
// ListNode node1[N];
// ListNode node2[N];
map<int,ListNode> mp1;
map<int,ListNode> mp2;
set<int> same;
int main(){
int ad,n;
cin>>ad>>n;
int f = ad;
for(int i = 0;i<n;i++){
int x,y,z;
cin>>x>>y>>z;
ListNode e;
e.num = y;
e.next = z;
mp1[x] = e;
//由于其输入不按顺序故没法直接再此去重(而在后面按地址进行遍历时才进行去重)
}
int fd = -1,flag = 0;//记录删除链表的第一个节点的地址
int pread = -1;
int delpre = -1;
do{
if(same.find(abs(mp1[ad].num))==same.end()){//找到最后都没有找到故在按地址顺序遍历下一个
same.insert(abs(mp1[ad].num));
pread = ad;//记录前一个的地址进而有利于删除
// printf("集合:");
// for(auto it = same.begin();it!=same.end();it++){
// printf("%d ",*it);
// }
// printf("\n");
}
//没有找到就要进行去重并对其链表进行维护
else{
if(flag==0){
fd = ad;
flag = 1;
mp2[ad].num = mp1[ad].num;
mp2[ad].next = -1;
delpre = ad;
//删除对应重复节点(实际上没有删除而只是按地址遍历时其不出现了而已)
mp1[pread].next = mp1[ad].next;//***
}else{
mp2[ad].num = mp1[ad].num;
mp2[ad].next = -1;
mp2[delpre].next = ad;
//删除对应重复节点(实际上没有删除而只是按地址遍历时其不出现了而已)
mp1[pread].next = mp1[ad].next;//***
}
mp2[ad].num = mp1[ad].num;
mp2[ad].next = -1;
//删除对应重复节点(实际上没有删除而只是按地址遍历时其不出现了而已)
mp1[pread].next = mp1[ad].next;
}
if(mp1[ad].next!=-1){
//pread = ad;//记录前一个的地址进而有利于删除
ad = mp1[ad].next;
}
else{
break;
}
}while(1);
while(f!=-1){
if(mp1[f].next==-1){
printf("%05d %d %d\n",f,mp1[f].num,mp1[f].next);
}
else{
printf("%05d %d %05d\n",f,mp1[f].num,mp1[f].next);
}
//cout<<f<<" "<<mp1[f].num<<" "<<mp1[f].next<<endl;
f = mp1[f].next;
}
while(fd!=-1){
if(mp2[fd].next==-1){
printf("%05d %d %d\n",fd,mp2[fd].num,mp2[fd].next);
}
else{
printf("%05d %d %05d\n",fd,mp2[fd].num,mp2[fd].next);
}
//cout<<fd<<" "<<mp2[fd].num<<" "<<mp2[fd].next<<endl;
fd = mp2[fd].next;
}
// ad = f;
// do{
// //cout<<ad<<" "<<mp1[ad].num<<" "<<mp1[ad].next<<endl;
// if(mp1[ad].next==-1){
// printf("%05d %d %d\n",ad,mp1[ad].num,mp1[ad].next);
// }
// else{
// printf("%05d %d %05d\n",ad,mp1[ad].num,mp1[ad].next);
// }
// if(mp1[ad].next!=-1){
// ad = mp1[ad].next;
// }else{
// break;
// }
// }while(1);
// ad = fd;
// do{
// //cout<<ad<<" "<<mp1[ad].num<<" "<<mp1[ad].next<<endl;
// if(mp2[ad].next==-1){
// printf("%05d %d %d\n",ad,mp2[ad].num,mp2[ad].next);
// }
// else{
// printf("%05d %d %05d\n",ad,mp2[ad].num,mp2[ad].next);
// }
// if(mp2[ad].next!=-1){
// ad = mp2[ad].next;
// }else{
// break;
// }
// }while(1);
return 0;
}