题目链接:点击打开链接
题目大意:略。
解题思路:
1、经过上次的“反转链表”的教训,千万记住别修复它们的 Next 地址,没必要的。只要抓住这一点,题目就简单了。
2、题目这句话:“只有键值或其绝对值等于K”意思表达不完全,其实是这个意思:“只有键值或其绝对值等于【绝对值的K】”。
3、删除重复链表的数据要注意可能都没重复的情况,所以第二组数据要不要输出需要判断下是否有重复的数据。
AC 代码
#include<bits/stdc++.h>
#include<cmath>
#define mem(a,b) memset(a,b,sizeof a);
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
int da[maxn], nx[maxn], vis[maxn], rs1[maxn], rs2[maxn];
int main()
{
int s,n,t;
while(~scanf("%d%d",&s,&n))
{
mem(vis,0);
for(int i=0;i<n;i++){ scanf("%d",&t); scanf("%d%d",&da[t],&nx[t]); }
int len1,len2; len1=len2=0;
while(s!=-1)
{
if(!vis[abs(da[s])]) vis[abs(da[s])]=1, rs1[len1++]=s;
else rs2[len2++]=s;
s=nx[s];
}
for(int i=0;i<len1-1;i++)
{
s=rs1[i];
printf("%05d %d %05d\n",s,da[s],rs1[i+1]);
}
printf("%05d %d -1\n",rs1[len1-1],da[rs1[len1-1]]);
if(len2!=0)
{
for(int i=0;i<len2-1;i++)
{
s=rs2[i];
printf("%05d %d %05d\n",s,da[s],rs2[i+1]);
}
printf("%05d %d -1\n",rs2[len2-1],da[rs2[len2-1]]);
}
}
return 0;
}