题目描述:
解题思路:
- 定义一个node用来存放数据data和下一地址next,为了通过一个节点的地址来找到这个节点,容易想到的办法是让这个地址就是他的数组下标。所以在输入节点时,先输入节点的地址temp,再用vector来存放每次输入的结点的数据传data和下一节点的地址next
- 定义一个List[maxn]存储可以连接上的顺序表,存放链接起来的各个结点的地址, 计数器num记录能够首尾相连的结点数量,p指向当前结点
- 每k个节点调用一次reverse做反转
AC代码
#include <bits/stdc++.h>
#define maxn 100010
using namespace std;
struct node
{
int data,next;
};
int main(){
vector<node>v(maxn);//vector用来存放每个节点的数据和下一结点的地址
int temp,Head,n,k;
cin>>Head>>n>>k;
for(int i=0;i<n;i++)
{
cin>>temp;
cin>>v[temp].data>>v[temp].next;
}
int p=Head,num=0;
int List[maxn];//存放链接起来的各个结点的地址
while(p!=-1)
{
List[num++]=p;
p=v[p].next;
}
//做反转
for(int i=0;i+k<num;i+=k)
reverse(&List[i],&List[i+k]);
for(int i=0;i<num-1;i++)
printf("%05d %d %05d\n",List[i],v[List[i]].data,List[i+1]);
printf("%05d %d -1",List[num-1],v[List[num-1]].data);
return 0;
}
参考:
https://tanyaodan.blog.csdn.net/article/details/84917553
https://blog.csdn.net/wanmeiwushang/article/details/51628989