本题常规链表题,与乙级有区别的地方是,这次要求对值排序,而不是翻转或者区块翻转,对于值排序,我选择使用第一个结构体按照散列存入list数组中,为了处理脏数据还能实现排序,选择使用第二个结构体node1存入vector中,然后对vector中的数据排序,排序后循环输出,坑点一:存在全部都是脏数据的情况,需要输出0和-1,但是第一次做测试点3错误扣3分,最终拿到22分,一直没找到答案,先放在这里,今后二刷回来考虑一下
代码:
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn = 1e5+10;
struct node{
int data;
int next;
}list[maxn];
struct node1{
int add;
int data;
};
bool cmp(node1 a,node1 b){
return a.data < b.data;
}
int main() {
int n, first;
cin >> n >> first;
while (n--) {
int temp;
cin >> temp;
cin >> list[temp].data >> list[temp].next;
}
vector<node1> vt;
while (first != -1) {
vt.push_back({first, list[first].data});
first = list[first].next;
}
sort(vt.begin(), vt.end(), cmp);
int key = 0;
if(vt.size() == 0){
cout<<0<<' '<<-1<<endl;
return 0;
}
cout << vt.size() << ' ' << vt[0].add << endl;
for (int i = 0; i < vt.size(); ++i) {
if (!key) {
key = 1;
printf("%05d %d ", vt[i].add, vt[i].data);
} else {
printf("%05d\n%05d %d ", vt[i].add, vt[i].add, vt[i].data);
}
}
cout << -1;
return 0;
}