1025 反转链表 (25 分)
分析:说实话,这道题我自己并没有做出来,也是参考的一位老哥的文章。下面附上原文链接https://blog.csdn.net/qq_40946921/article/details/81369679**
简单来分析一下。首先你要确定如何存取这些数据,一组有三个数据,所以我们想到了用结构体来对每组数据进行存储
然后,就是如何去找到每组数据之间的联系(就是谁在谁前面)而题中在第一行输入的时候给了一个首地址,也就是你能够根据这个首地址来找出第一组数据,然后根据每组数据找到下一组。我们再来想一下,给出的第一个首地址好比键(key),而它所对应的一组数据好比一个键值(value),所以我们自然能够想到用c++中的map来进行索引(其实map就相当于python中的字典);**
思路:建立结构体来存储每组数据的三个数值,然后建立一个由结构体和首地址构成的map,然后根据输入的首地址当作第一个键来找到它对应的第一组数据,再把第一组数据的next地址赋值给首地址,以此类推。确定先后顺序之后按照要求用reverse反转结构体数组即可;
代码如下:
#include<map>
#include<algorithm>
using namespace std;
struct Node {
int ads, data, next;
}node[100000];
int main() {
int n, k, str, start;
map<int, Node> m;
cin >> start >> n >> k;
for (int i = 0; i < n; i++) {
scanf("%d", &str); //输入结点数据
scanf("%d %d", &m[str].data, &m[str].next);
}
for (int i = 0; i < n; i++) {
node[i] = { start,m[start].data ,0 }; //通过map直接索引start将链表按顺序转到node数组里面
start = m[start].next;
if (start == -1) //当start被赋值为-1的时候,链表就结束了,更新n的值,测试点6
n = i + 1;
if ((i + 1) % k == 0)
reverse(node + i + 1 - k, node + i + 1); //反转
}
for (int i = 0; i < n; i++) { //输出
printf("%05d %d ", node[i].ads, node[i].data);
if (i != n - 1)
printf("%05d\n", node[i + 1].ads);
else
printf("-1"); //最后一个结点next为-1
}
return 0;
}