题目
题目大意
给定一个链表,要求按链表中的数值从小到大排序生成新的链表。输出有效节点的个数和链表的起始地址,以及链表本身。
思路
链表用结构体数组来表示,然后用sort自定义排序。需要注意的是,链表中存在无效节点,因此需要遍历一遍链表,将有效的节点筛选出来。同时也要注意格式化输出(测试点3是链表首地址格式化输出)。测试点4是当没有有效节点时,要输出0 -1。
代码
#include <iostream>
#include <algorithm>
using namespace std;
struct node{
int now; // 当前节点的地址
int key; // 节点值
int next; // 下一个节点的地址
}v[100000];
int n, s;
bool cmp(node x, node y){
return x.key < y.key;
}
int main(){
cin >> n >> s;
for (int i = 0; i < n; i++){
int ads;
cin >> ads;
v[ads].now = ads;
cin >> v[ads].key >> v[ads].next;
}
vector<node> res; // 记录有效链表的节点
for (int i = s; i != -1; i = v[i].next){
res.push_back(v[i]);
}
sort(res.begin(), res.end(), cmp);
if (!(int)res.size()){
cout << "0 -1" << endl; //测试点4
return 0;
}
printf("%d %05d\n", (int)res.size(), res[0].now); // 测试点3,首地址也要格式化输出
for (int i = 0; i < (int)res.size(); i++){
printf("%05d %d ", res[i].now, res[i].key); // 注意要格式化输出
if (i == (int)res.size() - 1){
printf("-1\n");
}else{
printf("%05d\n", res[i + 1].now);
}
}
return 0;
}