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;
}

這個代碼沒有加什麼註釋,我相信這個代碼很容易理解排序