原文链接:我的个人博客
原题链接
PAT 1133 Splitting A Linked List
考点
链表
思路
题目要求将负数全部放到非负数的前面。对于非负数,将[0,k]的数放到>k的前面。只要遍历list1,先加将负数push_back到list2中,再将list1中[0,k]的push_back到list2,最后将list1中大于k的数push_back进list2中。
代码
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6+10;
struct node{
int address;
int next;
int key;
}nod[maxn];
int head1,n,k;
vector<node>list1,list2;
int main(){
int address,next,key;
cin>>head1>>n>>k;
for(int i=1;i<=n;i++){
cin>>address>>key>>next;
nod[address].address = address;
nod[address].key = key;
nod[address].next = next;
}
for(head1;head1!=-1;head1=nod[head1].next){
list1.push_back(nod[head1]);
}
for(int i=0;i<list1.size();i++){
if(list1[i].key<0) list2.push_back(list1[i]);
}
for(int i=0;i<list1.size();i++){
if(list1[i].key>=0&&list1[i].key<=k) list2.push_back(list1[i]);
}
for(int i=0;i<list1.size();i++){
if(list1[i].key>k) list2.push_back(list1[i]);
}
for(int i=0;i<list2.size();i++){
if(i==list2.size()-1)
printf("%05d %d -1\n",list2[i].address,list2[i].key);
else
printf("%05d %d %05d\n",list2[i].address,list2[i].key,list2[i+1].address);
}
}