链表由一系列的结构体组成,每个结构体中包含一个 Key 值和一个指向下一个结构体的 Next 指针。
现在,给出一个链表,请你按照 Key 值升序的顺序将链表重新排序。
补充
1、本题中可能包含不在链表中的节点,这些节点无需统计,无需排序,无需输出。
2、链表可能为空。(头节点地址为 −1−1)。
输入格式
第一行首先包含一个整数 NN,表示总节点数量,然后包含链表头节点的地址。
接下来 NN 行,每行描述一个节点的信息,格式如下:
Address Key Next
其中 Address 是节点地址,Key 值是一个整数,Next 是下一个节点的地址。
地址都是 55 位正整数,可能有前导 00。
保证各节点的 Key 值互不相同,且链表中不存在环形结构。
输出格式
第一行首先输出一个整数表示链表的总节点数量,然后输出排序后的链表头节点地址。
接下来若干行,从头节点开始,依次输出每个节点的信息,格式与输入相同。
数据范围
1≤N≤1051≤N≤105,
−105≤Key≤105−105≤Key≤105
输入样例:
5 00001
11111 100 -1
00001 0 22222
33333 100000 11111
12345 -1 33333
22222 1000 12345
输出样例:
5 12345
12345 -1 00001
00001 0 11111
11111 100 22222
22222 1000 33333
33333 100000 -1
//测试点二
输入
5 -1
11111 100 -1
00001 0 22222
33333 100000 11111
12345 -1 33333
22222 1000 12345
输出
0 -1
分析:本题中可能包含不在链表中的节点,这些节点无需统计,无需排序,无需输出。有可能只有一部分节点
#include <iostream>
#include <cstring>
#include <vector>
#include<algorithm>
using namespace std;
const int N = 100010;
int n;
int h, ne[N];
int e[N];
bool cmp(int a,int b){ //传入的是地址
return e[a]<e[b]; //按照值的大小从小到大将地址排序
}
int main()
{
scanf("%d%d", &n, &h);
for (int i = 0; i < n; i ++ )
{
int address, next, data;
scanf("%d %d %d", &address, &data, &next);
e[address] = data, ne[address] = next;
}
vector<int>v;
for (int i = h; i != -1; i = ne[i])
v.push_back(i);
if(v.empty()){
cout<<0<<' '<<-1<<endl;
return 0;//直接结束
}
else{
sort(v.begin(),v.end(),cmp);
printf("%d %05d\n",v.size(),v[0]);
for(int i=0;i<v.size();i++){
if(i==v.size()-1)
printf("%05d %d %d\n",v[i],e[v[i]],-1);
else
printf("%05d %d %05d\n",v[i],e[v[i]],v[i+1]);
}
}
return 0;
}
#include <iostream>
#include <algorithm>
#include <unordered_map>
#include <vector>
using namespace std;
struct Node
{
int address;
int key;
int next;
bool operator< (const Node& t) const
{
return key < t.key;
}
};
int main()
{
int n;
int head;
scanf("%d%d", &n, &head);
unordered_map<int, Node> map;
int address, next;
vector<Node> nodes;
while (n -- )
{
int key;
scanf("%d%d%d", &address, &key, &next);
map[address] = {address, key, next};
}
for (int i = head; i != -1; i = map[i].next) nodes.push_back(map[i]);
printf("%d ", nodes.size());
if (nodes.empty()) puts("-1");
else
{
sort(nodes.begin(), nodes.end());
printf("%05d\n", nodes[0].address);
for (int i = 0; i < nodes.size(); i ++ )
{
if (i + 1 == nodes.size())
printf("%05d %d -1\n", nodes[i].address, nodes[i].key);
else
printf("%05d %d %05d\n", nodes[i].address, nodes[i].key, nodes[i + 1].address);
}
}
return 0;
}