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