pta l2-2(链表去重)
题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805072641245184
题意:给定一个链表,要求删除其中键值绝对值重复的结点然后输出,并将删除的结点组织成链表,也输出。
思路:刚开始我是用创建静态链表的思路来做,没出现过的加入链表1,出现过的加入链表2,虽然有些麻烦,但应该是可行的,可样例始终过不了,找了一晚上错误是在不知道错在哪,就放弃了。在网上看了另一种做法,十分简单,用结构体,a[i].key表示地址i处的键值,a[i].nxt表示下一个地址,b数组用来存放重复结点的地址,vis数组用来标记是否出现过,
AC代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 const int maxn=100005; 5 6 struct node{ 7 int key,nxt; 8 }a[maxn]; 9 10 int b[maxn],vis[10005],n,m,v,ct,t1,t2,t3; 11 12 int main(){ 13 scanf("%d%d",&m,&n); 14 for(int i=0;i<n;++i){ 15 scanf("%d%d%d",&t1,&t2,&t3); 16 a[t1].key=t2,a[t1].nxt=t3; 17 } 18 vis[abs(a[m].key)]=1; 19 printf("%05d %d",m,a[m].key); 20 while(1){ 21 m=a[m].nxt; 22 if(m==-1){ 23 printf(" -1\n"); 24 break; 25 } 26 if(!vis[abs(a[m].key)]){ 27 vis[abs(a[m].key)]=1; 28 printf(" %05d\n%05d %d",m,m,a[m].key); 29 } 30 else 31 b[ct++]=m; 32 } 33 if(ct>0){ 34 printf("%05d %d",b[0],a[b[0]].key); 35 for(int i=1;i<ct;++i) 36 printf(" %05d\n%05d %d",b[i],b[i],a[b[i]].key); 37 printf(" -1\n"); 38 } 39 return 0; 40 }
朋友们,无论这个世界变得怎样,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。