前言
正文
参考题解
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
/* 题意: 拆分链表,将单链表中每个结点的data值按照负数,小于k,大于等于k进行排序, 保持原先链表上的顺序 思路:还是套模板,只是本题把节点分三类(-无穷,0), [0,k], (k,+无穷) ,依次将它们 放到vector<Node> v容器中即可,最后输出 注意: */
const int N=1e5+10;
//第一步
struct Node{
int addr,data,next;
int order;
}node[N];
//排序的目的就是将合法结点和非法结点分开
bool cmp(Node a,Node b){
return a.order<b.order;
}
int main(){
//第二步
for(int i=0;i<N;i++)node[i].order=N;
int head,n,k;
cin>>head>>n>>k;
int addr,data,next;
//读入
for(int i=0;i<n;i++){
cin>>addr>>data>>next;
node[addr]={addr,data,next,N};
}
//第三步
int p=head,cnt=0;
while(p!=-1){
node[p].order=cnt++;
p=node[p].next;
}
//第四步
sort(node,node+N,cmp);
//第五步
//分三类加入到vector中
vector<Node> v;
for(int i=0;i<cnt;i++){
if(node[i].data<0)v.push_back(node[i]);
}
for(int i=0;i<cnt;i++){
if(node[i].data>=0&&node[i].data<=k)v.push_back(node[i]);
}
for(int i=0;i<cnt;i++){
if(node[i].data>k)v.push_back(node[i]);
}
for(int i=0;i<cnt;i++){
if(i!=cnt-1)printf("%05d %d %05d\n",v[i].addr,v[i].data,v[i+1].addr);
else printf("%05d %d -1\n",v[i].addr,v[i].data);
}
return 0;
}