1. 程式人生 > >PTAL2-002 連結串列去重解題報告---簡單鏈表實現

PTAL2-002 連結串列去重解題報告---簡單鏈表實現

                               L2-002 連結串列去重 (25 分)

給定一個帶整數鍵值的連結串列 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

 模擬連結串列,用其他陣列儲存去重後的連結串列和去重掉的連結串列

AC Code: 

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<string>
#include<cctype>
#include<map>
#include<vector>
#include<string>
#include<queue>
#include<stack>
#define INF 0x3f3f3f3f
using namespace std;
static const int MAX_N = 1e5 + 5;
typedef long long ll;
struct List{
	int key, next;
};
List list[MAX_N];
int main(){
	bool vis[MAX_N] = {false};		//判斷是否重複
	int *list1 = new int[MAX_N];	//陣列list1儲存去重後連結串列地址
	int *list2 = new int[MAX_N];	//陣列list2儲存重複的連結串列地址
	int head, n;
	scanf("%d%d", &head, &n);
	for (int i = 0; i < n; i++) {
		int point;
		scanf("%d", &point);
		scanf("%d%d", &list[point].key, &list[point].next);	//地址、按值、下一個結點
	}
	int size1 = 0, size2 = 0;
	for (int i = head; i != -1; i = list[i].next) {
		int v = abs(list[i].key);
		if (!vis[v]) {
			vis[v] = true;
			list1[size1++] = i;
		}
		else {
			list2[size2++] = i;
		}
	}
	for (int i = 0; i < size1 - 1; i++) {
		printf("%05d %d %05d\n", list1[i], list[list1[i]].key, list1[i + 1]);
	}
	printf("%05d %d -1\n", list1[size1 - 1], list[list1[size1 - 1]].key);
	if (size2 > 0) {
		for (int i = 0; i < size2 - 1; i++) {
			printf("%05d %d %05d\n", list2[i], list[list2[i]].key, list2[i + 1]);
		}
		printf("%05d %d -1\n", list2[size2 - 1], list[list2[size2 - 1]].key);
	}
	delete[]list1;
	delete[]list2;
	return 0;
}