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 33218Sample Output:
00000 4 33218 33218 3 12309 12309 2 00100 00100 1 99999 99999 5 68237 68237 6 -1
将一个链表按照长度m倒转,注意每m个节点要倒转一下,而不仅仅是前m个要倒转。用val记录地址对应的值,用next记录下一个点的值。然后由给出的开始的节点开始遍历链表,用order数组储存节点地址的顺序。然后用reverse函数对order数组进行倒转操作,每m个倒转一下。最后按照倒转后的order输出结果即可。最后还要注意给出的节点不一定都在链表内,所以在遍历求得order数组的过程中要排除掉那些不在链表中的点,不然最后的case过不了。
代码:
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
const int SIZE=100005;
int main()
{
int first,n,m;
cin>>first>>n>>m;
int val[SIZE];
int next[SIZE];
for(int i=0;i<n;i++)
{
int addr,v,naddr;
cin>>addr>>v>>naddr;
val[addr]=v;
next[addr]=naddr;
}
int cur=first;
vector<int>order;
for(int i=0;i<n;i++)
{
if(cur==-1) break;
order.push_back(cur);
cur=next[cur];
}
n=order.size();
int k=0;
while(m!=0&&k+m<=n)
{
reverse(order.begin()+k,order.begin()+k+m);
k+=m;
}
cout<<endl;
for(int i=0;i<n;i++)
{
printf("%05d %d ",order[i],val[order[i]]);
if(i==n-1)
{
printf("-1\n");
}
else
{
printf("%05d\n",order[i+1]);
}
}
}