原题链接:PAT 1165 Block Reversing (25分) 关键词:链表 整理时间:2020.7.24
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.
Input Specification:
Each input file contains one test case. For each case, the first line contains the address of the first node, a positive N (≤105) which is the total number of nodes, and a positive K (≤N) which is the size of a block. The address of a node is a 5-digit nonnegative integer, and NULL is represented by −1. Then N lines follow, each describes a node in the format: Address Data Next where Address is the position of the node, Data is an integer, and Next is the position of the next node.
Output Specification:
For each case, output the resulting ordered linked list. Each node occupies a line, and is printed in the same format as in the input.
Sample Input:
00100 8 3 71120 7 88666 00000 4 99999 00100 1 12309 68237 6 71120 33218 3 00000 99999 5 68237 88666 8 -1 12309 2 33218Sample Output:
71120 7 88666 88666 8 00000 00000 4 99999 99999 5 68237 68237 6 00100 00100 1 12309 12309 2 33218 33218 3 -1题目大意: 按照要求修改链表并输出
思路: 节点读进结构体数组a,再遍历链表读进v,最后再生成目标链表的顺序res。注意:可能并不是每个点都在链表上的 因此需要遍历一遍。res序号的顺序就是结果链表的顺序
代码:
#include <iostream> #include <vector> using namespace std; const int maxn = 1e7 + 10; int root, n, k; //root起始地址 n结点数 k块的长度 struct node{ int address, data, next; }a[maxn]; vector<node> v, res; int main(){ //freopen("in.txt", "r", stdin); //freopen("out.txt", "w", stdout); cin >> root >> n >> k; for(int i = 0; i < n; i ++ ){ int s, b, c; cin >> s >> b >> c; a[s].address = s; a[s].data = b; a[s].next = c; } for(int p = root; p != -1; p = a[p].next){ v.push_back(a[p]); } //具体的翻转部分建议在纸上先模拟 int len = v.size(); int gnum = (len + k - 1 )/k; for(int i = gnum - 1; i >= 0; i--){ int mx = (i + 1) * k > len ? len : (i + 1) * k; for(int j = i*k; j < mx; j++){ res.push_back(v[j]); } } for(int i = 0; i < res.size()-1; i ++ ) printf("%05d %d %05d\n", res[i].address, res[i].data, res[i+1].address); printf("%05d %d -1", res[res.size()-1].address, res[res.size()-1].data); return 0; }