https://pintia.cn/problem-sets/994805046380707840/problems/994805072641245184
先浅浅记录一下错误代码:(!没有考虑去掉是两者挨着的情况!)
#include<iostream>
#include <cmath>
using namespace std;
int Key[100005],Next[100005],Out[100005],Next2[100005];
// key存数值 next存下一个地址 out排序需要的链表(排除多余的)next2输出重的数值及地址
bool Judge[100005];
int main() {
int begin,n;
cin >> begin >> n;
int a,b,c;
for(int i = 0;i < n;i++){
cin >> a >> b >> c;
Key[a] = b;
Next[a] = c;
}
int t = 0;
// 遍历链表,out存入需要的链表地址;
for(int i = begin;i != -1;i = Next[i]){
Out[t++] = i;
}
n = t;
t = 0;
for(int i = 0;i < n;i++){
if(!Judge[abs(Key[Out[i]])]){
Judge[abs(Key[Out[i]])] = true;
}
else{
Next2[t++] = Out[i];
Next[Out[i-1]] = Out[i+1];
}
}
// 输出
for(int i = 0;i < n - t;i++){
if(i < n - t - 1)
printf("%05d %d %05d\n",begin,Key[begin],Next[begin]);
else printf("%05d %d -1\n",begin,Key[begin]);
begin = Next[begin];
}
for(int i = 0;i < t;i++){
if(i != t - 1)
printf("%05d %d %05d\n",Next2[i],Key[Next2[i]],Next2[i+1]);
else printf("%05d %d -1\n",Next2[i],Key[Next2[i]]);
}
return 0;
}
后来有改进了一下:(AC)
#include<iostream>
#include <cmath>
using namespace std;
int Key[100005],Next[100005],list1[100005],list2[100005];
//key存数值,next存下一个地址,list1为输出以去重的链表地址,list2为去重的地址
bool Judge[100005]; //是否为重复数值
int main() {
int begin,n;
cin >> begin >> n;
int a,b,c;
for(int i = 0;i < n;i++){
cin >> a >> b >> c;
Key[a] = b;
Next[a] = c;
}
//判断
int k1 = 0,k2 = 0;
for(int i = begin;i != -1;i = Next[i]){
if(!Judge[abs(Key[i])]){
Judge[abs(Key[i])] = true;
list1[k1++] = i;
}
else{
list2[k2++] = i;
}
}
//输出
for(int i = 0;i < k1;i++){
if(i < k1 - 1)
printf("%05d %d %05d\n",list1[i],Key[list1[i]],list1[i+1]);
else printf("%05d %d -1\n",list1[i],Key[list1[i]]);
}
for(int i = 0;i < k2;i++){
if(i < k2 - 1)
printf("%05d %d %05d\n",list2[i],Key[list2[i]],list2[i+1]);
else printf("%05d %d -1\n",list2[i],Key[list2[i]]);
}
return 0;
}