对于这样的题目,不要直接对列表进行反转,我们把链表按顺序放到数组中之后,在数组中反转,然后再打印输出。
代码
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
const int N = 1e5+10;
int e[N],ne[N];
int h,n,k;
int main(){
scanf("%d%d%d",&h,&n,&k);
//1.把相关信息存入邻接表
while(n--){
int ad,data,nxt;
scanf("%d%d%d",&ad,&data,&nxt);
e[ad]=data;ne[ad]=nxt;
}
vector<int> v;
//2.遍历邻接表,把链表顺序存入数组中
for(int i=h;~i;i=ne[i]) v.push_back(i);
//3.在数组中做反转,没k个反转一下,最后不足k个的不用反转
for(int i=0;i+k-1<v.size();i+=k)
reverse(v.begin()+i,v.begin()+i+k);
//4.输出结果;v中保存的是地址ad,然后根据地址输出相关的data,然后输出下一个元素的地址,
//即直接输出数组中下一个元素的ad即可
for(int i=0;i<v.size();i++){
printf("%05d %d ",v[i],e[v[i]]);
if(i==v.size()-1) puts("-1");
else printf("%05d\n",v[i+1]);
}
return 0;
}