7-2 链表去重 (25 分) - 数据结构第2章

这个题目我本身开始就是用最传统的方法来作这个题,也就是和选择排序差很少的思路;只不过是否是交换而是删除;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;
}

这个代码没有加什么注释,我相信这个代码很容易理解排序