题目描述
瑞神要准备考研了,为了复习数据结构,瑞神在某宝上买了一本数据结构得考研辅导资料《考研数据结构---从入门到放弃》,从此瑞神开始了愉快的复(zhuang)习(bi)。
有一天,瑞神找了好多条链表来辅助自己复习,但是他在复习的过程中一不小心把链表掉在了地上,捡起来的时候链表以及断成了好多个结点,每个结点只保留了当前结点的地址、结点的值和下一个结点的地址。瑞神看着这些结点浑身难受无法复习,为了让瑞神继续复(zhuang)习(bi)下去,请你帮瑞神把链表复原。
有一天,瑞神找了好多条链表来辅助自己复习,但是他在复习的过程中一不小心把链表掉在了地上,捡起来的时候链表以及断成了好多个结点,每个结点只保留了当前结点的地址、结点的值和下一个结点的地址。瑞神看着这些结点浑身难受无法复习,为了让瑞神继续复(zhuang)习(bi)下去,请你帮瑞神把链表复原。
输入
第一行给出结点的个数n(1<=n<=100000)。
接下来n行每行给出一个结点的信息:结点地址、值和下一个结点的地址。
地址为5位数字,-1表示地址为NULL。
保证每一条链表的最后一个结点的下一个结点地址为-1。
接下来n行每行给出一个结点的信息:结点地址、值和下一个结点的地址。
地址为5位数字,-1表示地址为NULL。
保证每一条链表的最后一个结点的下一个结点地址为-1。
输出
每一行输出一条链表,只输出每个节点的值。
多条链表按照首结点地址从小到大排序。
多条链表按照首结点地址从小到大排序。
样例输入
3
00323 155 -1
00322 87 00323
00233 1 -1
样例输出
1
87 155
map很好用
#include<iostream>
#include<cstdio>
#include<map>
#include<cstring>
#include<algorithm>
using namespace std;
int vis[100010];
struct Node{
int v;
int n;
}node;
int a1[100010];
int main()
{
int n;
cin>>n;
map<int,Node>mp;
memset(vis,0,sizeof(vis));
int a,b,c;
for(int i=0;i<n;++i)
{
cin>>a>>b>>c;
node.v=b;
node.n=c;
mp[a]=node;
a1[i]=a;
if(c!=-1)
{
vis[c]=1;
}
}
sort(a1,a1+n);
for(int i=0;i<n;++i)
if(!vis[a1[i]])
{
vis[a1[i]]=1;
cout<<mp[a1[i]].v;
int temp=mp[a1[i]].n;
//cout<<mp[a1[i]].n;
while(temp!=-1)
{
vis[temp]=1;
cout<<" "<<mp[temp].v;
temp=mp[temp].n;
}
cout<<endl;
}
}