http://pat.zju.edu.cn/contests/pat-a-practise/1074
简单实现即可:
注意题目中的细节,考虑好k=1,k=n的情况,还有就是给出的节点可能不在一个链表里,所以这里要遍历一次,直到-1结束。
可以AC的代码:
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 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | #include<stdio.h> #include<cstring> #include<string> using namespace std; #define N 100001 struct E{ int address; int c; int next; }buf[N]; int rev[N]; int main(){ int begin,n,k; int i,j; int x,y,z; int len1,len2; scanf("%d %d %d",&begin,&n,&k); while(n--){ scanf("%d %d %d",&x,&y,&z); buf[x].address=x; buf[x].c=y; buf[x].next=z; } x=begin; int ans=1; while(x!=-1){ rev[ans++]=buf[x].address; x=buf[x].next; } if(k==1){ x=begin; while(x!=-1){ if(buf[x].next!=-1) printf("%05d %d %05d\n",buf[x].address,buf[x].c,buf[x].next); else printf("%05d %d %d\n",buf[x].address,buf[x].c,buf[x].next); x=buf[x].next; } return 0; } //printf("ans=%d\n",ans); y=(ans-1)/k; //注意此处链中的数据数是ans-1 z=(ans-1)%k; if(y!=0) begin=rev[k]; for(i=1;i<=y;++i){ //每次循环修改K个 len1=(i-1)*k; len2=i*k; for(j=len2;j>len1;--j){ if(j==len1+1){ if(len2+1<ans && i==y){ buf[rev[j]].next=rev[len2+1];//如果下一次的K个中存在元素,则本次循环的最后一个指向他 } else if(len2+1<ans && i!=y){ //开始主要在此处出现错误,原因是只考虑到了len2+1<ans && i==y buf[rev[j]].next=rev[len2+k]; } else if(len2+1==ans){ buf[rev[j]].next=-1; //如果没有(链表中的元素个数正好为K的整数倍,则直接置-1,表示链表结束) } } else{ buf[rev[j]].next=rev[j-1]; //在原来的buf中改链表的next } } } x=begin; while(x!=-1){ if(buf[x].next!=-1) printf("%05d %d %05d\n",buf[x].address,buf[x].c,buf[x].next); else printf("%05d %d %d\n",buf[x].address,buf[x].c,buf[x].next); x=buf[x].next; } return 0; } |