L2-002 連結串列去重【陣列】
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(≤105,為結點總數)。一個結點的地址是非負的 5 位整數,空地址 NULL 用 −1 來表示。隨後 N 行,每行按以下格式描述一個結點:地址 鍵值 下一個結點。其中地址
是該結點的地址,鍵值
是絕對值不超過104的整數,下一個結點
是下個結點的地址。
輸出
首先輸出去重後的連結串列,然後輸出被刪除的連結串列。每個結點佔一行,按輸入的格式輸出。
樣例輸入
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;
}
相關文章
- L2-002 連結串列去重
- L2-002 連結串列去重(複習)
- 陣列和連結串列陣列
- 陣列與連結串列陣列
- 陣列去重方法總結陣列
- JS陣列去重 – JSON陣列去重陣列JSON
- 資料結構之連結串列與陣列(1):陣列和連結串列的簡介資料結構陣列
- 陣列去重陣列
- JavaScript陣列去重方法總結JavaScript陣列
- 可變陣列——連結串列前言陣列
- 陣列模擬單連結串列陣列
- 資料結構--陣列、單向連結串列、雙向連結串列資料結構陣列
- 線性結構 陣列與連結串列陣列
- 陣列物件去重陣列物件
- JavaScript陣列去重JavaScript陣列
- JavaScript 陣列去重JavaScript陣列
- js陣列去重JS陣列
- 陣列和連結串列的區別陣列
- 聊聊陣列與連結串列,棧與佇列陣列佇列
- 資料結構之陣列和連結串列資料結構陣列
- 面試-陣列和連結串列的區別面試陣列
- 刪除陣列中的元素(連結串列)陣列
- day1-陣列和連結串列陣列
- 陣列、連結串列、堆疊和佇列學習陣列佇列
- javascript之陣列去重JavaScript陣列
- JavaScript陣列去重方法JavaScript陣列
- 關於陣列去重陣列
- 陣列去重和求和陣列
- 陣列去重的方法陣列
- 陣列包含字典 去重陣列
- 陣列扁平和去重陣列
- js物件陣列去重JS物件陣列
- js陣列物件去重JS陣列物件
- golang 陣列去重 移除陣列指定元素Golang陣列
- 陣列去重和陣列扁平化陣列
- 重溫四大基礎資料結構:陣列、連結串列、佇列和棧資料結構陣列佇列
- 線性表(陣列、連結串列、佇列、棧)詳細總結陣列佇列
- web前端陣列處理之陣列去重Web前端陣列