L2-002.鏈表去重

分析:通過輸入輸出的樣例可以知道,數據的存儲不是真正的鏈表,通過思考觀察不難想出用結構體數組來模擬鏈表,其中每個節點的地址用數組的下標來表示。知道怎樣存儲後接下來就是怎麼去重,這裏去重採用的標記的辦法,既若該key值的絕對值第一次出現就將他標記,後面遍歷鏈表若發現該key值已被標記則說明該key值代表的節點需要刪去,這裏用vol[100001]數組來進行標記,key值爲數組的下標,刪去的節點按順序存儲其地址和key值與add[100001]和key[100001]數組中。最後按要求輸出

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
struct Node {
	int key;
	int rear;
};
int val[100001]; int add[100001]; int key[100001];
int main() {
	//初始化,讀入數據
	int ad, N;
	cin >> ad >> N;
	Node l[100001];
	for (int i = 0; i<100001; i++) {
		val[i] = 0;
	}
	int address, data, r;
	for (int i = 0; i<N; i++) {
		cin >> address >> data >> r;
		l[address].key = data;
		l[address].rear = r;
	}
	//遍歷查重
	int index = 0;
	int f = ad;//f爲要刪去節點的前驅節點地址
	for (int i = ad; i != -1; i = l[i].rear) {
		if (val[abs(l[i].key)] == 0) {
			val[abs(l[i].key)] = 1;
			f = i;
		}
		else {
			add[index] = i;
			key[index] = l[i].key;
			l[f].rear = l[i].rear;
			index++;
		}

	}
	//遍歷輸出
	for (int i = ad; i != -1; i = l[i].rear) {
		printf("%05d %d ", i, l[i].key);
		if (l[i].rear == -1)cout << -1 << endl;
		else printf("%05d\n", l[i].rear);
	}
	for (int i = 0; i<index; i++) {
		printf("%05d %d ", add[i], key[i]);
		if (i != index - 1)printf("%05d\n", add[i + 1]);
		else cout << -1 << endl;
	}
	return 0;
}

發佈了34 篇原創文章 · 獲贊 1 · 訪問量 2729
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章