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