Given a constant K K K and a singly linked list L L L, you are supposed to reverse the links of every K K K elements on L L L. For example, given L L L being 1→2→3→4→5→6, if K K K=3, then you must output 3→2→1→6→5→4; if K K 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 ( ≤ 1 0 5 ) N (≤10^5) N(≤105) which is the total number of nodes, and a positive K ( ≤ N ) K (≤N) 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 N 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
Caution:
刚开始的代码测试点 6 不过,后来查了查其他人的题解发现可能是因为测试点 6 的链表在中间就断开了(后面的就不再属于这个单链表),所以单链表的节点个数可能不是 n
,把代码里面表示节点个数的 n
换成 list.size()
之后就AC了。
Solution:
// Talk is cheap, show me the code
// Created by Misdirection 2021-08-21 22:35:42
// All rights reserved.
#include <iostream>
#include <vector>
#include <unordered_map>
#include <algorithm>
using namespace std;
int main(){
string head;
cin >> head;
int n, k;
scanf("%d %d", &n, &k);
unordered_map<string, pair<int, string>> map;
for(int i = 0; i < n; ++i){
string address, next;
int data;
cin >> address >> data >> next;
map[address].first = data;
map[address].second = next;
}
vector<pair<string, int>> list;
string tmp = head;
while(tmp != "-1"){
list.emplace_back(tmp, map[tmp].first);
tmp = map[tmp].second;
}
int pos = 0;
while(pos < list.size()){
int right;
if(pos + k - 1 >= list.size()) break;
else right = pos + k - 1;
reverse(list.begin() + pos, list.begin() + right + 1);
pos = right + 1;
}
for(int i = 0; i < list.size(); ++i){
if(i == list.size() - 1) printf("%s %d -1\n", list[i].first.c_str(), list[i].second);
else printf("%s %d %s\n", list[i].first.c_str(), list[i].second, list[i + 1].first.c_str());
}
return 0;
}