PAT

来源:互联网 发布:泰拳起源 知乎 编辑:程序博客网 时间:2024/05/18 03:00

Given a constant K and a singly linked list L, you are supposed to reverse the links of every K elements on L. For example, given L being 1→2→3→4→5→6, if K = 3, then you must output 3→2→1→6→5→4; if K = 4, you must output 4→3→2→1→5→6.

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 length of the sublist to be reversed. 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 6 400000 4 9999900100 1 1230968237 6 -133218 3 0000099999 5 6823712309 2 33218
Sample Output:
00000 4 3321833218 3 1230912309 2 0010000100 1 9999999999 5 6823768237 6 -1

给定条件:
1.n个节点的地址,值,下一个地址
2.链表的第一个节点的地址
3.每k个元素进行一次反转,如果剩下的不够k个则不进行反转

求解:
1.遍历链表,直接把元素往栈中放,满k个就全部弹出来放到另一个容器,(后进先出实现“反转”)
2.最后把不满k个的元素顺序拿出即可


#include <cstdio>#include <vector>using namespace std;struct Node {int ad, val, nextAd;} node[100010];int start, n, k;int ad, val, nextAd;vector<Node> v, ans;int main() {scanf("%d%d%d", &start, &n, &k);for(int i = 0; i < n; i++) {scanf("%d%d%d", &ad, &val, &nextAd);node[ad].ad = ad;node[ad].val = val;node[ad].nextAd = nextAd;}for(int i = start; i != -1; i = node[i].nextAd) {v.push_back(node[i]);if(v.size() % k == 0) {while(!v.empty()) {ans.push_back(v.back());v.pop_back();}}}for(int i = 0; i < v.size(); i++) {ans.push_back(v[i]);}for(int i = 0; i < ans.size()-1; i++) {printf("%05d %d %05d\n", ans[i].ad, ans[i].val, ans[i+1].ad);}printf("%05d %d -1\n", ans.rbegin()->ad, ans.rbegin()->val);return 0;}