题意是给你一条静态链表,让你根据键值排序
有两点需要注意:
一是题目里可能会给不在给定链上的节点,给节点加一个onlist值,在写cmp函数的时候判断,把不在链上的放到后面去
二是有可能出现给定链上没有节点的情况,做题一定要多想一下为0的情况,需要特判输出
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <climits>
using namespace std;
const int MAXN = 1e6 + 5;
struct Node {
int add, data, next;
int onlist;
} N[MAXN];
bool cmp(const Node &a, const Node &b)
{
if (a.onlist != b.onlist) return a.onlist < b.onlist;
else return a.data < b.data;
}
int main()
{
int n;
scanf("%d", &n);
int head;
scanf("%d", &head);
for (int i = 0; i < MAXN; i++)
{
N[i].data = INT_MAX;
}
for (int i = 0; i < n; i++)
{
int add;
scanf("%d", &add);
N[add].add = add;
scanf("%d %d", &N[add].data, &N[add].next);
N[add].onlist = 0;
}
int count = 0;
for (int p = head; p != -1; p = N[p].next)
{
N[p].onlist = -1;
count ++;
}
if (count == 0)
{
printf("0 -1\n");
return 0;
}
sort(N, N + MAXN, cmp);
printf("%d %05d\n", count, N[0].add);
for (int i = 0; i < count - 1; i++)
{
printf("%05d %d %05d\n", N[i].add, N[i].data, N[i + 1].add);
}
printf("%05d %d -1\n", N[count - 1].add, N[count - 1].data);
return 0;
}