【PTA刷题】链表题套路

PTA的链表其实和力扣的挺不一样的,PTA的其实都是用数组来模拟的,而且往往并不限制新开一个数组。出题模式比较固定。因此固定套路是把链表问题变成数组问题来做:
1.开一个装有结构体Node的固定数组,脚标为地址,模拟指针用。
2.从start给的地址开始遍历链表,把链表按顺序放入一个vector中。
3.根据给的条件来变换数组。将结果保存在ans数组中,最后打印出来。

1165.19冬季第二题


大意:Given a singly linked list L. Let us consider every K nodes as a block (if there are less than K nodes at the end of the list, the rest of the nodes are still considered as a block). Your job is to reverse all the blocks in L. For example, given L as 1→2→3→4→5→6→7→8 and K as 3, your output must be 7→8→4→5→6→1→2→3。

每隔K个数认为是一个整体,然后整体大块颠倒顺序,但整体内部顺序不变。

#include <iostream>
#include <string>
#include <algorithm>
#include <map>
#include <vector>
#include <set>
#include <queue>

using namespace std;

struct Node
{
   
	int val;
	int add, next;
};

const int maxnum = 100005;
int S, N, K;
Node a[maxnum];

int main()
{
   
	cin >> S >> N >> K;
	for (int i = 0; i < N; i++)
	{
   
		Node node;
		cin >> node.add >> node.val >> node.next;
		a[node.add] = node;
	}

	vector<Node> vec;
	for (int i = S; i != -1; i = a[i].next)
		vec.push_back(a[i]);

	int len = vec.size();
	vector<Node> ans(len);
	int remain = len % K;
	int m; //位置i经过变换后在第m个大块
	int j = 0;//i在当前大块中的第j个小位置
	for (int i = 0; i < len; i++)
	{
   
		if (i < len - remain)
		{
   
			int m = (len - i) / K - 1;
			ans[K * m + remain + j] = vec[i]; //大块数量* m + 一定在最前面的remain部分 + 块内位置
			j = (j + 1) % K;
		}
		else
			ans[i - len + remain] = vec[i];
	}

	for (int i = 0; i < ans.size(); i++)
	{
   
		if (i != ans.size() - 1)
			printf("%05d %d %05d\n", ans[i].add, ans[i].val, ans[i + 1].add);
		else
			printf("%05d %d -1", ans[i].add, ans[i].val);

	}

	return 0;
}

1133


大意:Given a singly linked list, you are suppos
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值