题目链接:https://pintia.cn/problem-sets/994805260223102976/problems/994805296180871168
分析:反转链表,难点有两个。一,如何将各数据联系起来;二,如何反转链表;
首先,考虑到数据的大小,不能简单的根据地址去找,必然会超时,所以采取空间换时间的思路,建立一个数组,用首地址做下标,用next做内容,再用一个list数组顺序保存各数据首地址,只要找到链表的首地址,根据该数据即可往后找;然后,反转链表我们可以通过reversre反转list数组,通过反转的list数组来访问data数据(不直接反转数据,而是反转与数据有关的变量)
这里,题目存在一个情况,提供的数据可能不在该链表内,所以要自己统计实际的list的数据的个数。
代码:
#include<iostream>
using namespace std;
#include<cstring>
#include<string>
#include<cctype>
#include<cmath>
#include<vector>
#include<algorithm>
int main()
{
int a;
cin>>a;
int n,m;
cin>>n>>m;
int next[100005];
int data[100005];
int list[100005];
int k;
for(int i=0;i!=n;++i)
{
cin>>k;
cin>>data[k]>>next[k];
}
int sum=0;
for(int i=0;a!=-1;++i)
{
list[i]=a;
a=next[a];
sum++; //统计实际的链表数据的个数
}
for(int i=0;i<sum/m;++i)
reverse(list+i*m,list+(i+1)*m);
for(int i=0;i<sum;++i)
{
if(i==sum-1)
printf("%05d %d -1\n",list[i],data[list[i]]);
else
printf("%05d %d %05d\n",list[i],data[list[i]],list[i+1]);
}
return 0;
}