L2-002 連結串列去重【陣列】

Enjoy_process發表於2019-03-25

                                                  L2-002 連結串列去重

                 https://pintia.cn/problem-sets/994805046380707840/problems/994805072641245184

 

 

題目

給定一個帶整數鍵值的連結串列 L,你需要把其中絕對值重複的鍵值結點刪掉。即對每個鍵值 K,只有第一個絕對值等於 K 的結點被保留。同時,所有被刪除的結點須被儲存在另一個連結串列上。例如給定 L 為 21→-15→-15→-7→15,你需要輸出去重後的連結串列 21→-15→-7,還有被刪除的連結串列 -15→15。

輸入

輸入在第一行給出 L 的第一個結點的地址和一個正整數 N(≤10​5​​,為結點總數)。一個結點的地址是非負的 5 位整數,空地址 NULL 用 −1 來表示。隨後 N 行,每行按以下格式描述一個結點:地址 鍵值 下一個結點。其中地址是該結點的地址,鍵值是絕對值不超過10​4​​的整數,下一個結點是下個結點的地址。

輸出

首先輸出去重後的連結串列,然後輸出被刪除的連結串列。每個結點佔一行,按輸入的格式輸出。

樣例輸入

00100 5
99999 -7 87654
23854 -15 00000
87654 15 -1
00000 -15 99999
00100 21 23854

樣例輸出

00100 21 23854
23854 -15 99999
99999 -7 -1
00000 -15 87654
87654 15 -1

分析

用兩個陣列分別記錄留下的結點和刪除的結點,陣列中相鄰的元素是在連結串列中相鄰的,這樣元素v[i]的下一個結點的地址就是v[i+1]的地址。

C++程式

#include<iostream>
#include<cmath>
#include<map> 
#include<vector>
#include<set>

using namespace std;

const int N=100005;
const int INF=100000;

set<int>s;//記錄已經出現的元素 
map<int,int>d;//<元素地址,此元素在temp陣列中的下標> 

struct Node{//結點 
	int val,addr,next;
}t[N];

struct Res{
	int val,addr;
	Res(int val,int addr):val(val),addr(addr){}
}; 

vector<Res>v[2];//v[0]表示留下的結點,v[1]表示刪除的結點 

int main()
{
	int n,start;
	scanf("%d%d",&start,&n);
	for(int i=0;i<n;i++)
	{
		int addr,val,next;
		scanf("%d%d%d",&t[i].addr,&t[i].val,&t[i].next);
		d[t[i].addr]=i;//對映,地址為addr的元素所在t中的下標為i 
	}
	//從起始位置遍歷連結串列中的元素 
	while(start!=-1)
	{
		int j=d[start];//地址為start的元素在t陣列中的下標為j 
		if(s.find(abs(t[j].val))==s.end())//不是重複元素,放在v[0]中 
		{
			s.insert(abs(t[j].val));//壓入集合中
			v[0].push_back(Res(t[j].val,t[j].addr)); 
		}
		else//是重複元素,放在v[1]中 
		{
			v[1].push_back(Res(t[j].val,t[j].addr));
		}
		start=t[j].next;//獲取下一個元素 
	}
	//列印v[0]中的元素 
	int end=v[0].size()-1;
	for(int i=0;i<end;i++)
	  printf("%05d %d %05d\n",v[0][i].addr,v[0][i].val,v[0][i+1].addr);
	printf("%05d %d %d\n",v[0][end].addr,v[0][end].val,-1);
	
	//列印v[1]中的元素 
	end=v[1].size()-1;
	if(end<0) return 0;
	for(int i=0;i<end;i++)
	  printf("%05d %d %05d\n",v[1][i].addr,v[1][i].val,v[1][i+1].addr);
	printf("%05d %d %d\n",v[1][end].addr,v[1][end].val,-1);
	return 0;
} 

 

相關文章