当前位置: 代码迷 >> 综合 >> PAT - 甲级 - 1074. Reversing Linked List (25)(链表)
  详细解决方案

PAT - 甲级 - 1074. Reversing Linked List (25)(链表)

热度:78   发布时间:2023-10-09 14:02:34.0

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 4
00000 4 99999
00100 1 12309
68237 6 -1
33218 3 00000
99999 5 68237
12309 2 33218
Sample Output:
00000 4 33218
33218 3 12309
12309 2 00100
00100 1 99999
99999 5 68237
68237 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;
}

  相关解决方案