1074 Reversing Linked List(25 分)(cj)

1074 Reversing Linked List(25 分)

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

code

#pragma warning(disable:4996)
#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <string>
#include <vector>
#include <iomanip>
using namespace std;
class node{
public:
	int address=-1, data, next=-1;
};
node address[100005];
vector<node> varr;

int main() {
	int p, n, k;
	scanf("%d %d %d", &p, &n, &k);
	int adr, data, next;
	for (int i = 0; i < n; ++i) {
		scanf("%d", &adr);
		address[adr].address = adr;
		scanf("%d", &address[adr].data);
		scanf("%d", &address[adr].next);
	}
	int h = p;
	while (h != -1) {
		varr.push_back(address[h]);
		h = address[h].next;
	}
	/*for (int i = 0; i < varr.size(); ++i) {
		cout << varr[i].data << ' ';
	}
	cout << endl;*/
	vector<node> vres(varr.size());
	for (int i = 0; i <= (varr.size())/k*k-1; ++i) {
		vres[i/k*k + (k-1 - i%k)] = varr[i];
		//cout << i / k * k + (k - 1 - i % k) << endl;
	}
	for (int i = (varr.size())/k*k; i < varr.size(); ++i) {
		vres[i] = varr[i];
	}
	//cout << endl;
	for (int i = 0; i < vres.size()-1; ++i) {
		printf("%05d %d %05d\n", vres[i].address, vres[i].data, vres[i + 1].address);
	}
	printf("%05d %d -1\n", vres[vres.size() - 1].address, vres[vres.size() - 1].data);
	system("pause");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/Cute_jinx/article/details/82315902