PTAL2-002 連結串列去重解題報告---簡單鏈表實現
阿新 • • 發佈:2019-01-13
L2-002 連結串列去重 (25 分)
給定一個帶整數鍵值的連結串列 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
模擬連結串列,用其他陣列儲存去重後的連結串列和去重掉的連結串列
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; }