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 (≤) which is the total number of nodes, and a positive K (≤) 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
/*
Name:
Copyright:
Author: 流照君
Date: 2019/8/5 14:52:14
Description:
*/
#include <iostream>
#include<string>
#include <algorithm>
#include <vector>
using namespace std;
const int inf=100100;
int main(int argc, char** argv)
{
//freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
int num=0,first,n,k,list[inf],add[inf],temp,next[inf];
cin>>first>>n>>k;
for(int i=1;i<=n;i++)
{
cin>>temp;
cin>>add[temp]>>next[temp];
}
while(first!=-1) //不是所有输入都是有用的
{
list[num++]=first;
first=next[first];
}
for(int i=0;i<num-num%k;i=i+k)
reverse(begin(list)+i,begin(list)+i+k); //反转函数
for(int i=0;i<num-1;i++)
printf("%05d %d %05d\n",list[i],add[list[i]],list[i+1]);
printf("%05d %d -1", list[num - 1], add[list[num - 1]]);
return 0;
}
特别说一下
C++11引入了 begin 和 end 的函数,这两个函数与容器中的两个同名成员功能类似,不过这两个函数不是成员函数,而是含有参数的函数。
用法说明:
begin 返回首元素的地址,end 返回尾元素的下一个地址。