7-2 Reversing Linked List (25分)
解题思路:
1、结点地址是固定5位整数,故可用数组按结点地址存放
2、利用辅助数组存放排好序的链表(不在链表上的多余结点不处理),当k=1时,链表不翻转,k>1时按要求翻转链表
#include <stdio.h> #define Max 100000 typedef struct { int Addr; int Data; int Next; } Node[Max]; int main() { int n,k,i,j=0,t=0,pos,cnt; scanf("%d%d%d",&pos,&n,&k); Node list,tmp; int x,y,z; for(i=0; i<n; i++) { scanf("%d%d%d",&x,&y,&z); list[x].Addr=x; list[x].Data=y; list[x].Next=z; } while(pos!=-1) { tmp[j++]=list[pos]; pos=list[pos].Next; } if(k>1) { cnt=j/k; int s=0,r=j%k; while(cnt--) { for(i=s+k-1; i>s; i--) { tmp[i].Next=tmp[i-1].Addr; list[t++]=tmp[i]; } if(s+2*k<=j) { tmp[i].Next=tmp[s+2*k-1].Addr; list[t++]=tmp[i]; s+=k; } } if(r) { tmp[i].Next=tmp[j-r].Addr; list[t++]=tmp[i]; } else { tmp[i].Next=-1; list[t++]=tmp[i]; } while(t<j) { list[t++]=tmp[j-r]; r--; } for(i=0; i<t; i++) { if(i!=t-1) printf("%05d %d %05d\n",list[i].Addr,list[i].Data,list[i].Next); else printf("%05d %d %d\n",list[i].Addr,list[i].Data,list[i].Next); } } else { for(i=0; i<j; i++) { if(i!=j-1) printf("%05d %d %05d\n",tmp[i].Addr,tmp[i].Data,tmp[i].Next); else printf("%05d %d %d\n",tmp[i].Addr,tmp[i].Data,tmp[i].Next); } } return 0; }
勤能补拙,熟能生巧