Given a constant??and a singly linked list?, you are supposed to reverse the links of every??elements on?. For example, given?being 1→2→3→4→5→6, if?, then you must output 3→2→1→6→5→4; if?, 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??() which is the total number of nodes, and a positive??() 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??lines follow, each describes a node in the format:
1 |
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:
1 2 3 4 5 6 7 8 |
00100 6 4 00000 4 99999 00100 1 12309 68237 6 -1 33218 3 00000 99999 5 68237 12309 2 33218 |
Sample Output:
1 2 3 4 5 6 |
00000 4 33218 33218 3 12309 12309 2 00100 00100 1 99999 99999 5 68237 68237 6 -1 |
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
#include<iostream> #define MaxSize 100000 using namespace std; int main(){ int Data[MaxSize]; int Next[MaxSize]; int list[MaxSize]; int FirstAdd,N,K; cin>>FirstAdd>>N>>K; for(int i=0;i<N;i++){ int tmpAdd,tmpData,tmpNext; cin>>tmpAdd>>tmpData>>tmpNext; Data[tmpAdd] = tmpData; Next[tmpAdd] = tmpNext; } int sum=0; while(FirstAdd!=-1){ list[sum++] = FirstAdd; FirstAdd = Next[FirstAdd]; } for(int i=0;i<sum-sum%K;i+=K){ for(int j=0;j<K/2;j++){ int t = list[i+j]; list[i+j] = list[i+K-j-1]; list[i+K-j-1] = t; } } for(int i=0;i<sum-1;i++) printf("%05d %d %05d\n",list[i],Data[list[i]],list[i+1]); printf("%05d %d -1\n",list[sum-1],Data[list[sum-1]]); return 0; } |