PAT.A1074 Reversing Linked List

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

猜你喜欢

转载自blog.csdn.net/mokena1/article/details/81145929
今日推荐