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
单链表每k个节点翻转一次
#include<bits/stdc++.h>
using namespace std;
struct node{
string Address, Next;
int Data;
};
int main()
{
string head;
int n, k,count=0;
cin >> head >> n >> k;
node tmp;
map<string, pair<int, string>>list;
for (int i = 0; i < n; i++){
cin >> tmp.Address >> tmp.Data >> tmp.Next;
list[tmp.Address] = make_pair(tmp.Data, tmp.Next);
}
vector<node>re, temp;
while (head != "-1"){
count++;//计数
temp.push_back(node{ head,list[head].second,list[head].first });
if (count == k){
reverse(temp.begin(), temp.end());//反转
for (auto i : temp)
re.push_back(i);
temp.clear();
count = 0;
}
head = list[head].second;
}
for (auto i : temp)//可能有不到k个的
re.push_back(i);
for (int i = 0; i < re.size() - 1; i++)//重新链接
printf("%s %d %s\n", re[i].Address.c_str(), re[i].Data, re[i + 1].Address.c_str());
printf("%s %d -1\n", re.back().Address.c_str(), re.back().Data);
return 0;
}