题目
题目大意
给定一个链表的首节点地址和节点个数,以及一个数k。要求重新排列该链表,使其按<0 ,>= 0 && <= k,>k 的顺序排序。但是不改变原有顺序,比如-4 -> -6 -> -2,不需要再内部排序为-6 -> -4 -> -2。
思路
先遍历一遍链表,过滤掉无效节点,然后将元素按类别分别存放在3个数组中,最后再依次输出这3个数组。但是最后一个测试点发生段错误。所以我将这3个数组又合为一个数组输出。
代码
cpp
#include <iostream>
#include <vector>
using namespace std;
struct node{
int ads;
int data;
int next;
}v[100001];
int s, n, k;
int main(){
cin >> s >> n >> k;
for (int i = 0; i < n; i++){
int ads;
cin >> ads;
v[ads].ads = ads;
cin >> v[ads].data >> v[ads].next;
}
vector<node> range1; // 负数范围
vector<node> range2; // 0到k
vector<node> range3; // 大于k
for (int i = s; i != -1; i = v[i].next){
if (v[i].data < 0){
range1.push_back(v[i]);
}else if (v[i].data <= k){
range2.push_back(v[i]);
}else{
range3.push_back(v[i]);
}
}
vector<node> res; // 将3个数组合到一个数组中再输出,如果按照下面的注释代码分别输出,测试点4段错误
for (int i = 0; i < (int)range1.size(); i++){
res.push_back(range1[i]);
}
for (int i = 0; i < (int)range2.size(); i++){
res.push_back(range2[i]);
}
for (int i = 0; i < (int)range3.size(); i++){
res.push_back(range3[i]);
}
for (int i = 0; i < (int)res.size(); i++){
printf("%05d %d ", res[i].ads, res[i].data);
if (i != (int)res.size() - 1){
printf("%05d\n", res[i + 1].ads);
}else{
printf("-1\n");
}
}
/*for (int i = 0; i < (int)range1.size(); i++){
printf("%05d %d ", range1[i].ads, range1[i].data);
if (i != (int)range1.size() - 1){
printf("%05d\n", range1[i + 1].ads);
}else{
if ((int)range2.size() == 0 && (int)range3.size() == 0){
printf("-1\n");
return 0;
}
printf("%05d\n", range2[0].ads);
}
}
for (int i = 0; i < (int)range2.size(); i++){
printf("%05d %d ", range2[i].ads, range2[i].data);
if (i != (int)range2.size() - 1){
printf("%05d\n", range2[i + 1].ads);
}else{
if ((int)range3.size() == 0){
printf("-1\n");
return 0;
}
printf("%05d\n", range3[0].ads);
}
}
for (int i = 0; i < (int)range3.size(); i++){
printf("%05d %d ", range3[i].ads, range3[i].data);
if (i != (int)range3.size() - 1){
printf("%05d\n", range3[i + 1].ads);
}else{
printf("-1\n", range3[0].ads);
}
}*/
return 0;
}