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