浙大数据结构课后习题 练习二 7-2 Reversing Linked List (25 分)
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
#include <iostream> #include <vector> #define M 100000 using namespace std; struct ele{ int addr; int data; int next=-1; }; int main(){ int iniAddr,num,revNum,tmpAddr,tmpData,tmpNext; ele element[M],last; cin>>iniAddr>>num>>revNum; while(num--){ cin>>tmpAddr>>tmpData>>tmpNext; element[tmpAddr].addr=tmpAddr; element[tmpAddr].data=tmpData; element[tmpAddr].next=tmpNext; } vector<ele> vec; while(iniAddr!=-1){ vec.push_back(element[iniAddr]); iniAddr=element[iniAddr].next; } //反转 int point=0;bool start=true; while(true){ point+=revNum; if(point>vec.size()) break; else{ for(int i=point-1,j=0;j<revNum;j++,i--){ if(start) printf("%05d ",vec[i].addr); else printf("%05d\n%05d ",vec[i].addr,vec[i].addr); printf("%d ",vec[i].data); last=vec[i]; start=false; } } } point-=revNum; for(int i=point;i<vec.size();i++){ if(start) printf("%05d ",vec[i].addr); else printf("%05d\n%05d ",vec[i].addr,vec[i].addr); printf("%d ",vec[i].data); start=false; last=vec[i]; } printf("-1"); system("pause"); return 0; }