L2-002 链表去重 (25分)
解题思路:
1、注意到结点地址是固定5位整数,故输入数据可以按地址存放。
2、键值<=10000,故可用辅助数组按键值标记重复出现的键值
3、用两个辅助数组分别存放去重后的链表、被删除的链表
4、分别打印
#include <stdio.h> #define Max 100000 typedef struct{ int addr,data,next; }Node; int main() { int pos,n; int i,j=0,k=0; int k1=0,k2=0; Node list[Max]; Node tmp[Max],del[Max]; int x,y,z; int vis[Max]={0}; scanf("%d%d",&pos,&n); 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; } for(i=pos;pos!=-1;pos=list[pos].next) { if(!vis[abs(list[pos].data)]) { vis[abs(list[pos].data)]=1; tmp[k1++]=list[pos]; } else { del[k2++]=list[pos]; } } for(i=0;i<k1;i++) { if(i!=k1-1) printf("%05d %d %05d\n",tmp[i].addr,tmp[i].data,tmp[i+1].addr); else printf("%05d %d -1\n",tmp[i].addr,tmp[i].data); } for(i=0;i<k2;i++) { if(i!=k2-1) printf("%05d %d %05d\n",del[i].addr,del[i].data,del[i+1].addr); else printf("%05d %d -1\n",del[i].addr,del[i].data); } return 0; }
勤能补拙,熟能生巧