思路:
①定义静态链表,存入结点的地址,data,next;
②初始化所有结点为无效结点;
③从头结点开始遍历整个链表,并将出现过的设置为有效结点;
④对结点进行排序,有效在前,无效在后;二级排序:按数据域从小到大;
⑤输出。
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 100010;
// 一、定义静态链表
struct Node {
int add;
int data;
int next;
bool flag;
}node[maxn];
bool cmp(Node a, Node b) {
if (a.flag == false || b.flag == false)
return a.flag > b.flag;
else
return a.data < b.data;
}
int main() {
// 二、初始化
for (int i = 0; i < maxn; i++) {
node[i].flag = false;
}
int n, head, add;
scanf("%d%d", &n, &head);
// 录入结点信息
for (int i = 0; i < n; i++) {
scanf("%d", &add);
scanf("%d%d", &node[add].data, &node[add].next);
node[add].add = add;
}
// 三、遍历链表,排除无效结点
int cnt = 0;
for (int p = head; p != -1; p = node[p].next) {
node[p].flag = true;
cnt++;
}
if (cnt == 0) // 没有特判,测试点4错误
printf("0 -1\n");
else {
// 排序
sort(node, node + maxn, cmp);
//
printf("%d %05d\n", cnt, node[0].add); // 这里格式忘了,测试点3错误
for (int i = 0; i < cnt - 1; i++) {
printf("%05d %d %05d\n", node[i].add, node[i].data, node[i + 1].add);
}
printf("%d %d -1\n", node[cnt - 1].add, node[cnt - 1].data);
}
return 0;
}
测试点4:
特殊情况,n=0,begin=-1
测试点3:
第一个结点的地址begin没有补齐五位输出。