思路分析:本题难度一般,之所以写出来是想分享一个应试技巧:在最后的结果中,看似是前驱后继紧紧联系在一起的,其实在输出过程中,完全不必拘泥于这一点,专门修改指针甚至构建双向链表,只需要在输出的时候做一些简单的修改就好了。代码比较简单,注释比较详细,具体步骤就不写了。
在非第一行时,每一行只输出addres和data;输出下一行时用当前的addres补上上一行没打印的next并换行,然后再输出本行的addres和data,如此循环下去。
最后一个测试点因为PAT系统问题有可能过不去,多试几次就好了O(∩_∩)O
示例代码:
#include<iostream>
#include<vector>
#include<iomanip>
using namespace std;
int main(){
int add1,n,k;
cin>>add1>>n>>k;
vector<vector<int>> link(100001,vector<int>(2));//二维数组 第一个为数据域 第二个为next域
for(int i = 0; i < n; i++){
int add,data,next = -1;//空指针用-1表示
cin>>add>>data>>next;
link[add][0] = data;
link[add][1] = next;
}
vector<vector<int>> lib(3);//小于0、区间、大于0的部分的节点地址
while(add1 != -1){
if(link[add1][0] < 0){//数据域小于0
lib[0].push_back(add1);//存储节点
}else if(link[add1][0] >= 0 && link[add1][0] <= k){
lib[1].push_back(add1);
}else{
lib[2].push_back(add1);
}
add1 = link[add1][1];
}
bool isfirst = true;
for(int i = 0; i < 3; i++){
for(int j = 0; j < lib[i].size(); j++){
if(!isfirst)
cout<<setw(5)<<setfill('0')<<lib[i][j]<<endl;//残余在上一行的next
cout<<setw(5)<<setfill('0')<<lib[i][j];
cout<<" "<<link[lib[i][j]][0]<<" ";
isfirst = false;
}
}
cout<<-1<<endl;
return 0;
}