pta l2-2(鏈表去重)

題目連接:https://pintia.cn/problem-sets/994805046380707840/problems/994805072641245184node

題意:給定一個鏈表,要求刪除其中鍵值絕對值重複的結點而後輸出,並將刪除的結點組織成鏈表,也輸出。c++

思路:剛開始我是用建立靜態鏈表的思路來作,沒出現過的加入鏈表1,出現過的加入鏈表2,雖然有些麻煩,但應該是可行的,可樣例始終過不了,找了一夜錯誤是在不知道錯在哪,就放棄了。在網上看了另外一種作法,十分簡單,用結構體,a[i].key表示地址i處的鍵值,a[i].nxt表示下一個地址,b數組用來存放重複結點的地址,vis數組用來標記是否出現過,數組

AC代碼:spa

 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 }
相關文章
相關標籤/搜索