Given a constant K and a singly linked list L, you are supposed to reverse the links of every Kelements 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
#include<cstring>
#include <iostream>
#include <vector>
#include<algorithm>
#include <string>
#include <cstdio>
using namespace std;
struct node {
int address;
int data;
int next;
};
int addr[100005];
int main()
{
int init, list;
memset(addr, -1, sizeof(addr));
int n;
vector<node> vInput;
cin >> init >> n >> list;
int count = 0;
vInput.clear();
for (int i = 0; i < n; i++)
{
node temp;
cin >> temp.address>>temp.data>>temp.next;
vInput.push_back(temp);
addr[temp.address]=count++;//表示是第几个输入的,后面建立vector linkNode的时候用的到
}
vector<node>linkNode;
int p = init;
for (int i = 0; i < n; i++)//将节点按地址的先后顺序排好
{
int pos = addr[p];
node temp = vInput[pos];
linkNode.push_back(temp);
p = temp.next;
if (p == -1)break;
}
int time = linkNode.size() / list;//题干: reverse the links of every Kelements on L,所以可能不止一组要反转
for (int i = 0; i < time; i++)
{
reverse(linkNode.begin()+i*list, linkNode.begin()+i*list+list);//每list个节点为一组进行反转
}
for (int i = 0; i < linkNode.size(); i++)//输出
{
if (i==linkNode.size()-1)
{
printf("%05d %d -1", linkNode[i].address, linkNode[i].data);//最后一个节点只要输出address和data就好了,next为-1
}
else
{
printf("%05d %d %05d", linkNode[i].address, linkNode[i].data, linkNode[i + 1].address);//第i个节点的next为下一个节点的地址
}
cout<<endl;
}
return 0;
}