这个题目我本身开始就是用最传统的方法来作这个题,也就是和选择排序差很少的思路;只不过是否是交换而是删除;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; }
这个代码没有加什么注释,我相信这个代码很容易理解排序