原题:1052. Linked List Sorting (25)
解题思路:
把题目要求的链表上的数排序后修改后继地址并输出即可。
有几个陷阱:
1)链表可能不止一条
2)最后一个样例是 n > 0 ,head = -1的情况
代码如下:
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn = 100000 + 5;
struct Node
{
int ad;
int val;
int next;
int flag;
bool operator < (const Node& rhs) const
{
return flag > rhs.flag || (flag == rhs.flag && val < rhs.val);
}
} node[maxn];
int main()
{
int n, s;
while(scanf("%d%d", &n, &s) == 2)
{
for(int i = 0; i < maxn; i++) node[i].flag = 0; //初始化, flag = 1表示在题目要求的链上
for(int i = 0; i < n; i++)
{
int ad, val, next;
scanf("%d%d%d", &ad, &val, &next);
node[ad].ad = ad;
node[ad].val = val;
node[ad].next = next;
}
if(n == 0 || s == -1) {printf("0 -1\n"); continue;}
int cnt = 0, p = s;
while(p != -1) {cnt++; node[p].flag = 1; p = node[p].next;} //求出在所求链表上的结点
sort(node, node+maxn); //把在要求的链表上的结点按顺序排在最前面
n = cnt;
for(int i = 0; i < n-1; i++)
node[i].next = node[i+1].ad;
node[n-1].next = -1;
printf("%d %05d\n", n, node[0].ad);
for(int i = 0; i < n-1; i++)
printf("%05d %d %05d\n", node[i].ad, node[i].val, node[i].next);
printf("%05d %d %d\n", node[n-1].ad, node[n-1].val, node[n-1].next);
}
return 0;
}