PAT-ADVANCED1097——Deduplication on a Linked List
阿新 • • 發佈:2018-11-11
我的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++解題報告: