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 (<= 10^5^) 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
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
#include<iostream>
#include<string>
#include<set>
#include<map>
#include<utility>
#include<stack>
#include<queue>
using namespace std;
const int maxn = 100010;
struct Node {
int add, key, next;
int youxiao;
}node[maxn],nodet[maxn];
bool cmp(Node a, Node b) {
return a.youxiao < b.youxiao;
}
int main() {
int begin, n, k,start;
scanf("%d%d%d",&begin,&n,&k);
for (int i = 0; i < maxn; i++)
node[i].youxiao = maxn;
for (int i = 0; i < n; i++) {
int add;
scanf("%d", &add);
scanf("%d%d", &node[add].key, &node[add].next);
node[add].add = add;
}
int p = begin, c = 0;
while (p != -1) {
node[p].youxiao = c;
p = node[p].next;
c++;
}
sort(node, node + maxn, cmp);
n = c;
for (int i = 0; i < n / k; i++) {
for (int j = 0; j < k; j++) {
int m = (i + 1)*k - 1 - j;
printf("%05d %d ", node[m].add, node[m].key);
if (j < k - 1) printf("%05d\n", node[m - 1].add);
else {
if (i < n / k - 1) printf("%05d\n", node[(i + 2)*k - 1].add);
else {
if (n%k == 0) printf("-1\n");
else {
printf("%05d\n",node[(i+1)*k].add);
for (int p = (i + 1)*k; p < n; p++) {
printf("%05d %d ", node[p].add, node[p].key);
if (p < n - 1) printf("%05d\n", node[p].next);
else printf("-1\n");
}
}
}
}
}
}
return 0;
}