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 33218Sample 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;
}