1. 程式人生 > >PAT-ADVANCED1097——Deduplication on a Linked List

PAT-ADVANCED1097——Deduplication on a Linked List

我的PAT-ADVANCED程式碼倉:https://github.com/617076674/PAT-ADVANCED

原題連結:https://pintia.cn/problem-sets/994805342720868352/problems/994805369774129152

題目描述:

題目翻譯:

1097 去除連結串列中的重複元素

給定帶有整數鍵的單鏈表L,你需要刪除具有重複的鍵絕對值的節點。也就是說,對於每個值K,將僅保留其鍵的值或絕對值等於K的第一節點。同時,所有已刪除的節點必須儲存在單獨的連結串列中。例如,如果L為21→-15→-15→-7→15,則必須輸出21→-15→-7,並輸出刪除掉的節點組成的連結串列-15→15。

輸入格式:

每個輸入檔案包含一個測試用例。 對於每個測試用例,第一行包含第一個節點的地址和一個正整數N(<= 10 ^ 5),代表節點的總數。 節點的地址是5位非負整數,NULL由-1表示。

然後是N行,每行按下述形式描述一個節點:

Address Key Next

其中Address是節點的地址,Key是結點的鍵值,其絕對值值不超過10 ^ 4,Next是下一個節點的地址。

輸出格式:

對每個測試用例,首先輸出刪除重複節點後的連結串列,再輸出刪除掉的節點組成的連結串列。每個節點佔一行,格式和輸入相同。

輸入樣例:

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

知識點:連結串列

思路:用一個大小為10001的陣列標記遍歷到當前節點連結串列中已經出現過的絕對值

對於保留節點和刪除節點,分開依次存放進兩個vector集合裡,最後再統一對每個節點的next進行定向。

時間複雜度和空間複雜度均是O(N)。

C++程式碼:

#include<iostream>
#include<vector>
#include<cmath>

using namespace std;

struct node {
	int address;
	int key;
	int next;
	node() {};
	node(int _address, int _key, int _next) : address(_address), key(_key), next(_next) {};
};

node Node[100000];
bool remainFlag[10001];	//標記連結串列中已經出現過的節點絕對值 

int main() {
	fill(remainFlag, remainFlag + 10001, false);
	int first, N, address, key, next, cur;
	scanf("%d %d", &first, &N);
	for(int i = 0; i < N; i++) {
		scanf("%d %d %d", &address, &key, &next);
		Node[address] = node(address, key, next);
	}
	vector<node> remained;
	vector<node> removed;
	cur = first;
	while(cur != -1){
		if(!remainFlag[abs(Node[cur].key)]){
			remained.push_back(Node[cur]);
			remainFlag[abs(Node[cur].key)] = true;
		}else{
			removed.push_back(Node[cur]);
		}
		cur = Node[cur].next;
	}
	for(int i = 0; i < remained.size(); i++){
		if(i != remained.size() - 1){
			printf("%05d %d %05d\n", remained[i].address, remained[i].key, remained[i + 1].address);
		}else{
			printf("%05d %d -1\n", remained[i].address, remained[i].key);
		}
	}
	for(int i = 0; i < removed.size(); i++){
		if(i != removed.size() - 1){
			printf("%05d %d %05d\n", removed[i].address, removed[i].key, removed[i + 1].address);
		}else{
			printf("%05d %d -1\n", removed[i].address, removed[i].key);
		}
	}
	return 0;
}

C++解題報告: