PTA 1025 反转链表 (c++ +思路+分析)

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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

给个选择

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值