這個題目我本身開始就是用最傳統的方法來作這個題,也就是和選擇排序差很少的思路;只不過是否是交換而是刪除;ios
也就是先記錄下鏈表當中第一個數字;而後拿這個數字和剩餘的數字進行比較,若是相同則把當前這個節點刪除,也就是將前一個節點指向該節點的下一個節點(和動態鏈表中的刪除操做同樣),而後就把這個刪除的節點存到一個容器當中(這裏我用的queue),而後接着用鏈表中的第二個數字,和剩餘的數字進行比較,重複上述操做;下面是個人代碼(沒有AC);順便說一下這個代碼的時間複雜度爲(N^2)數組
#include <iostream> using namespace std; #include <algorithm> #include <queue> struct LinkNode{ int pre; int ne; int val; }s[100000]; int main() { int head,n; cin>>head>>n; if(!n)return 0; int p,v,ne; for(int i= 0;i<n;i++) { cin >> p >> v >> ne; s[p].val = v; s[p].pre = p; s[p].ne = ne; } /*for(int i = head;i!=-1;i=s[i].ne) { printf("%05d %d %05d\n",i,s[i].val,s[i].ne) ; }*/ queue<LinkNode>del; for(int i = head;i!=-1;i = s[i].ne) { int pre = i; // cout <<"pre = "<<pre<<endl; for(int j = s[i].ne;j!=-1;j= s[j].ne) { if(abs(s[j].val)==abs(s[i].val)) { s[pre].ne = s[j].ne; del.push(s[j]); continue; } pre = s[pre].ne; } } for(int i = head;i!=-1;i=s[i].ne) { if(s[i].ne==-1) { printf("%05d %d -1\n",i,s[i].val) ; } else { printf("%05d %d %05d\n",i,s[i].val,s[i].ne) ; } } while(del.size()) { auto s1 =del.front(); del.pop(); if(del.size()) { auto s2 =del.front() ; printf("%05d %d %05d\n",s1.pre,s1.val,s2.pre) ; } else { printf("%05d %d %d\n",s1.pre,s1.val,-1) ; } } return 0; }
具體錯誤緣由本身也沒有找出來;spa
下面這個是我從網上看到的一個思路;就是直接記錄下哪一個值出現過哪一個值沒有出現過;把第一次出現過得存到一個數組裏(這裏我存到了queue),以後出現過得存到另外一個數組裏,這樣咱們就能刪除那些重複的元素,以及把不重複的元素和刪除的元素打印出來;這樣時間複雜度還低(N^2),而且這個思路還更容易理解;code
#include <iostream> using namespace std; #include <algorithm> #include <queue> #include <unordered_set> int a[100000],d[100000]; void print(queue<int>q1) { while(q1.size()) { auto s1 =q1.front(); q1.pop(); if(q1.size()) { int s2 = q1.front(); printf("%05d %d %05d\n",s1,d[s1],s2) ; } else { printf("%05d %d %d\n",s1,d[s1],-1); } } } int main() { int head,n; cin>>head>>n; int p,v,ne; unordered_set<int>st; for(int i= 0;i<n;i++) { cin >> p >> v >> ne; a[p] = ne; d[p] = v; } queue<int>q1,q2; int pre = head; while(pre!=-1) { int da = abs(d[pre]); if(!st.count(da)) { q1.push(pre); st.insert(da); } else { q2.push(pre); } pre = a[pre]; } print(q1); print(q2); return 0; }
這個代碼沒有加什麼註釋,我相信這個代碼很容易理解排序