题目链接
题目分析
输入中含有无效结点,只需对有效结点操作即可
解题思路
1、对于无效结点:结构体中设置属性flag
,表示是否在链表中
2、有效结点按key
值进行结构体排序即可
(也可把有效结点摘取出来,存储在另一个数组,有效结点较少的情况这样排序更快)
AC程序(C++)
/**************************
*@Author: 3stone
*@ACM: PAT A1052 Linked List Sorting
*@Time: 18/7/18
*@IDE: VSCode 2018
***************************/
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxSize 100010
using namespace std;
struct Point{
int st, data, ed;
int flag;
}point[maxSize + 5], new_p[maxSize];
//比较规则
bool cmp(Point a, Point b){
if(a.flag != b.flag)
return a.flag > b.flag;
else
return a.data < b.data;
}
//标记有效结点,并返回有效结点数
int myCheck(int st) {
int num = 0;
while(st != -1){
num++; //统计有效结点数
point[st].flag = 1;
st = point[st].ed;
}
return num;
}
int main(){
int n, start, ad, count;
while(scanf("%d %d", &n, &start) != EOF){
for(int i = 0; i < maxSize; i++){//初始化
point[i].data = maxSize;
point[i].flag = 0; //初始均为 无效结点
}
for(int i = 0; i < n; i++){//输入数据
scanf("%d", &ad);
point[ad].st = ad;
scanf("%d %d", &point[ad].data, &point[ad].ed);
}
//审查,标记有效结点
count = myCheck(start);
sort(point, point + maxSize, cmp);
if (count < 1) {
printf("0 -1\n");
}else {
printf("%d %05d\n", count, point[0].st);
for(int i = 0; i < count - 1; i++)
printf("%05d %d %05d\n", point[i].st, point[i].data, point[i + 1].st);
printf("%05d %d -1\n", point[count - 1].st, point[count-1].data);
}
}//while
return 0;
}