PAT A1052 Linked List Sorting
思路:由于题目所给结点中键值唯一,可直接根据键值排序,注意输入中的结点可能并不属于链表,需要在Node中添加flag标志查看是否处于题目的链表中,并根据此编写cmp函数将其排序到末尾。
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 100005;
typedef struct {
int addr;
int data;
int next;
bool flag;
} Node;
Node node[maxn];
bool cmp(Node a, Node b) {
if(a.flag == false || b.flag == false) {
return a.flag > b.flag;
}
return a.data < b.data;
}
int main() {
int n, s1;
scanf("%d %d", &n, &s1);
int addr, data, next;
for(int i = 0; i < n; i++) {
scanf("%d %d %d", &addr, &data, &next);
node[addr].addr = addr;
node[addr].data = data;
node[addr].next = next;
node[addr].flag = false;
}
int p = s1, cnt = 0;
while(p != -1) {
node[p].flag = true;
p = node[p].next;
cnt++;
}
if(cnt == 0) printf("0 -1\n");
else {
sort(node, node + maxn, cmp);
printf("%d %05d\n", cnt, node[0].addr);
for(int i = 0; i < cnt; i++) {
if(i < cnt-1) {
printf("%05d %d %05d\n", node[i].addr, node[i].data, node[i+1].addr);
} else {
printf("%05d %d -1\n", node[i].addr, node[i].data);
}
}
}
return 0;
}