PAT_A1052
PAT甲级1052.
目录
A1052
题目
样例
输入:
5 00001
11111 100 -1
00001 0 22222
33333 100000 11111
12345 -1 33333
22222 1000 12345
输出:
5 12345
12345 -1 00001
00001 0 11111
11111 100 22222
22222 1000 33333
33333 100000 -1
思路和坑点
将整个链表单独拉出来,放在一个数组中,链表的结点结构体中要记录自己的id,便于最后输出。这里忽略对next指针的处理,因为对一个结点来说,下一个的id就是他的next,直接引用下一个结点的id就好了。
坑点
特判结点个数为0的情况,提前判定。
以上的next处理方法,最后尾指针需要单独处理。
AC代码
#include<bits/stdc++.h>
using namespace std;
typedef struct node{
int id,data,next;
}Node;
Node all[100005];
bool cmp(Node a,Node b){
return a.data<b.data;
}
int main(void){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt","r",stdin);
#endif
int n,head;
scanf("%d%d",&n,&head);
vector<Node> v;
for(int i=0;i<n;i++){
int id;
scanf("%d",&id);
all[id].id=id;
scanf("%d%d",&all[id].data,&all[id].next);
}
for(int i=head;i!=-1;i=all[i].next) //将链表重新整合进一个数组中
v.push_back(all[i]);
sort(v.begin(),v.end(),cmp); //按要求排序
if(v.size()==0){ //特判如果0个有效结点
printf("0 -1");
return 0;
}
printf("%d %05d\n",v.size(),v[0].id); //输出结果
int i=0;
for(i=0;i<v.size()-1;i++){ //下一个next指针,即后边一个的id
printf("%05d %d %05d\n",v[i].id,v[i].data,v[i+1].id);
}
printf("%05d %d -1",v[i].id,v[i].data);
return 0;
}