原题
题目大意及思路
将链表元素以三个部分进行重新排列:
小于0的元素 【0,K】 大于K的元素
每个部分内部以原序列进行排列。
这里我们使用一个node结构体数组存储,通过下标可以直接找到对应node。
首先用一个动态数组存储初始排列,通过三部分分别遍历并存入ans动态数组中,再输出ans动态数组元素。
代码
#include<iostream>
#include<vector>
using namespace std;
struct node{
int add,value,next;
};
int main(){
int firstadd,n,k;
cin>>firstadd>>n>>k;
node a[100010];
vector<node> data,ans;
for(int i=0;i<n;i++){
int ad,v,n;
cin>>ad>>v>>n;
a[ad]={ad,v,n};
}
for(;firstadd!=-1;firstadd=a[firstadd].next) data.push_back(a[firstadd]);
for(int i=0;i<data.size();i++) if(data[i].value<0) ans.push_back(data[i]);
for(int i=0;i<data.size();i++) if(data[i].value>=0&&data[i].value<=k) ans.push_back(data[i]);
for(int i=0;i<data.size();i++) if(data[i].value>k) ans.push_back(data[i]);
for(int i=0;i<ans.size()-1;i++) printf("%05d %d %05d\n",ans[i].add,ans[i].value,ans[i+1].add);
printf("%05d %d -1\n",ans[ans.size()-1].add,ans[ans.size()-1].value);
return 0;
}
运行截图
收获
- 选择合适的数据结构很重要
- 特别好的一句代码:
for(;firstadd!=-1;firstadd=a[firstadd].next) data.push_back(a[firstadd]);