标签:
给定一个常数K以及一个单链表L,请编写程序将L中每K个结点反转。例如:给定L为1→2→3→4→5→6,K为3,则输出应该为3→2→1→6→5→4;如果K为4,则输出应该为4→3→2→1→5→6,即最后不到K个元素不反转。
输入格式:
每个输入包含1个测试用例。每个测试用例第1行给出第1个结点的地址、结点总个数正整数N(<= 105)、以及正整数K(<=N),即要求反转的子链结点的个数。结点的地址是5位非负整数,NULL地址用-1表示。
接下来有N行,每行格式为:
Address Data Next
其中Address是结点地址,Data是该结点保存的整数数据,Next是下一结点的地址。
输出格式:
对每个测试用例,顺序输出反转后的链表,其上每个结点占一行,格式与输入相同。
输入样例:
00100 6 4 00000 4 99999 00100 1 12309 68237 6 -1 33218 3 00000 99999 5 68237 12309 2 33218
输出样例:
00000 4 33218 33218 3 12309 12309 2 00100 00100 1 99999 99999 5 68237 68237 6 -1
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <iostream> 4 #include <string.h> 5 #include <math.h> 6 #include <algorithm> 7 #include <string> 8 #include <stack> 9 #include <queue> 10 using namespace std; 11 const int maxn=100010; 12 struct Node{ 13 int data; 14 int address; 15 int next; 16 int order; 17 }node[maxn]; 18 19 bool cmp(Node a,Node b) 20 { 21 if(a.order==-1||b.order==-1) 22 return a.order>b.order; 23 else{ 24 return a.order<b.order; 25 } 26 } 27 28 int main(){ 29 for(int i=0;i<maxn;i++) 30 { 31 node[i].order=-1;//顺序都为负 32 } 33 int begin,n,k,address; 34 scanf("%d %d %d",&begin,&n,&k); 35 for(int i=0;i<n;i++) 36 { 37 scanf("%d",&address); 38 scanf("%d %d",&node[address].data,&node[address].next); 39 node[address].address=address; 40 } 41 42 int p=begin,count=0; 43 while(p!=-1)//遍历得有效节点 44 { 45 node[p].order=count++; 46 p=node[p].next; 47 } 48 sort(node,node+maxn,cmp); 49 // 50 n=count; 51 //单链表排序完毕 开始输出 52 for(int i=0;i<n/k;i++) 53 { 54 //最后一块不一定完整 55 //逆向输出 56 for(int j=(i+1)*k-1;j>i*k;j--) 57 { 58 printf("%05d %d %05d\n",node[j].address,node[j].data,node[j-1].address); 59 } 60 //每块最后一个点 61 printf("%05d %d ",node[i*k].address,node[i*k].data) ; 62 if(i<n/k-1) 63 { 64 printf("%05d\n",node[i*k+2*k-1].address); 65 }else 66 { 67 if(n%k==0)printf("-1\n"); 68 else 69 { 70 printf("%05d\n",node[(i+1)*k].address); 71 //多余节点按序输出 72 for(int j=(i+1)*k;j<n;j++) 73 { 74 printf("%05d %d ",node[j].address,node[j].data) ; 75 if(j==n-1)printf("-1\n"); 76 else 77 printf("%05d\n",node[j+1].address); 78 } 79 80 } 81 } 82 } 83 return 0; 84 }
标签:
原文地址:http://www.cnblogs.com/ligen/p/4314333.html