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、使用C++的时候,对于所给的地址值,不能简单设置为int类型的变量!!!如0开头的五位数就没办法按照五位的格式正确输出;
2、测试点数据中存在冗余元素,所以需要在程序中统计真实有效的数据个数;
3、对于多段实现反转的情况要好好分析“指针”的赋值变化
#include<iostream>
#include<unordered_map>
#include<string>
using namespace std;
class Node {
public:
string add;
int num;
string next;
Node(string a=" ", int n=-1, string ne=" ") {
add = a; num = n; next = ne;
}
};
int main() {
string fir;int N, K; cin >> fir >> N >> K;
unordered_map<string, Node>rec;
int n = N;
while (n--) {
string h, t; int v; cin >> h >> v >> t;
rec[h] = Node(h, v, t);
}
int sum = 0; string p = fir;
while (p != "-1") {
sum++;
p = rec[p].next;
}
int times = int(sum / K); int time = times;
string f = fir;string r = f;
string pre = "-1";
while (time--) {
int flag = K - 1;while (flag--) r = rec[r].next;
string next = rec[r].next;
string nextpre = f;
while (f != r) {
string tem = f;
f = rec[f].next;
rec[tem].next = rec[r].next;
rec[r].next = tem;
}
if (time == times - 1)fir = f;
else rec[pre].next =r;
pre = nextpre; f = r = next;
}
while (fir != "-1") {
cout << rec[fir].add << " " << rec[fir].num << " " << rec[fir].next;
fir = rec[fir].next;
if (fir != "-1")cout << endl;
}
}