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 33218
Sample Output:
00000 4 33218 33218 3 12309 12309 2 00100 00100 1 99999 99999 5 68237
68237 6 -1
这题花了一点时间,但是并不难,第一要注意有可能不是所有的节点都要用到,所以有可能最后输出小于给出的节点。后来想到可以用reverse直接做的,然后下个节点的地址也可以不用存储,最后再输出。这个代码很粗糙,下次再来优化。
#include<iostream> #include<cstdio> using namespace std; struct node { int address; int key; int next; }a[100005],b[100005],c[100005]; int main() { int ad; int m,n; cin>>ad>>n>>m; for(int i=0;i<n;i++) { node A; cin>>A.address>>A.key>>A.next; a[A.address]=A; } int k=1; long temp=ad; while(a[temp].next!=-1) { b[k++].address=temp; b[k-1].key=a[temp].key; b[k-1].next=a[temp].next; temp=a[temp].next; } b[k].address=a[temp].address; b[k].key=a[temp].key; b[k].next=-1; int t=0; int i; for(i=1;i*m<=k;i++) { for(int j=i*m;j>(i-1)*m;j--) { c[t++].address=b[j].address; c[t-1].key=b[j].key; } } for(int j=(i-1)*m+1;j<=k;j++) { c[t++].address=b[j].address; c[t-1].key=b[j].key; } for(int q=0;q<k-1;q++) { c[q].next=c[q+1].address; } c[k-1].next=-1; for(int q=0;q<k-1;q++) { printf("%05ld %d %05ld\n",c[q].address,c[q].key,c[q].next); } printf("%05ld %d %d\n",c[k-1].address,c[k-1].key,-1); return 0; }