传送门
参考题解
#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; }