这一题的意思是让给出的链表按照每个节点的值的大小排序,按照升序排,
很容易想到直接用sort依据值进行排序即可。但要注意的是给出的节点,可能不都是在一个链表上的,有可能有孤立的节点,因此我们应该先对链表进行从头到尾的遍历一遍,找到在链表上有多少个节点。
#include <iostream>
#include <limits.h>
#include <cstring>
#include <queue>
#include <unordered_map>
#include <algorithm>
#include <cmath>
#include <vector>
#include <map>
using namespace std;
int N;
int startaddress;
int endaddress;
struct node
{
int address;
int key;
int next;
}linklist[100005];
bool cmp(node a,node b)
{
if(a.key<b.key)
{
return true;
}
else
{
return false;
}
}
int main()
{
//ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin>>N>>startaddress;
for(int i=0;i<N;i++)
{
int address;
int key;
int next;
cin>>address>>key>>next;
linklist[address].address=address;
linklist[address].key=key;
linklist[address].next=next;
}
vector<node> ans;
while(startaddress!=-1)
{
//startaddress=linklist[startaddress].next;
ans.push_back(linklist[startaddress]);
startaddress=linklist[startaddress].next;
}
int cnt=ans.size();
if(cnt==0)
{
printf("0 -1\n");
return 0;
}
sort(ans.begin(),ans.end(),cmp);
for(int i=0;i<cnt;i++)
{
if(i==0)
{
startaddress=ans[i].address;
}
if(i==cnt-1)
{
ans[i].next=-1;
}
else
ans[i].next=ans[i+1].address;
}
printf("%d %05d\n",cnt,startaddress);
for(int i=0;i<cnt;i++)
{
if(i==cnt-1)
{
printf("%05d %d %d\n",ans[i].address,ans[i].key,ans[i].next);
}
else
{
printf("%05d %d %05d\n",ans[i].address,ans[i].key,ans[i].next);
}
//printf("%05d %d %05d\n",ans[i].address,ans[i].key,ans[i].next);
}
return 0;
}