程序设计基础72 链表基础

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

一,关注点

1,关于链表题是非常灵活的,结构体里面不只可以有next和data,也可以有address,order。这对解题十分方便。

2,注意本题的输入数据可以有多条链表,即有多个-1,这时候链表结点的数量就不是刚开始输入的那个N了,就得开始更新了。

二,正确代码

#include<cstdio>
#include<algorithm>
using namespace std;
const int max_n = 100100;
struct Node {
	int address, data, next;
	int order;
}node[max_n];
bool cmp(Node a, Node b) {
	return a.order < b.order;
}
int main() {
	int begin = 0, N = 0, K = 0;
	for (int i = 0; i < max_n; i++) {
		node[i].order = max_n;
	}
	int address = 0, data = 0, next = 0;
	int count = 0;
	int p = 0;
	scanf("%d %d %d", &begin, &N, &K);
	for (int i = 0; i < N; i++) {
		scanf("%d %d %d", &address, &data, &next);
		node[address].address = address;
		node[address].data = data;
		node[address].next = next;
	}
	p = begin;
	while (p != -1) {
		count++;
		node[p].order = count;
		p = node[p].next;
	}
	N = count;
	sort(node, node + max_n, cmp);
	for (int i = 0; i < N / K; i++) {
		for (int j = (i + 1)*K - 1; j > i*K; j--) {
			printf("%05d %d %05d\n", node[j].address, node[j].data, node[j - 1].address);
		}
		printf("%05d %d", node[i*K].address, node[i*K].data);
		if (i != N / K - 1) {
			printf(" %05d\n", node[(i + 2)*K - 1].address);
		}
		else {
			if (N%K == 0) {
				printf(" -1");
			}
			else {
				printf(" %05d\n", node[(i+1)*K].address);
				for (int j = N / K*K; j < N; j++) {
					printf("%05d %d", node[j].address, node[j].data);
					if (j != N - 1) {
						printf(" %05d\n", node[j+1].address);
					}
					else {
						printf(" -1");
					}
				}
			}
		}
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq2285580599/article/details/84700121