天梯賽L2 002 鍊錶去重

2021-09-13 13:39:12 字數 1816 閱讀 1259

problem description:

給定乙個帶整數鍵值的鍊錶 l,你需要把其中絕對值重複的鍵值結點刪掉。即對每個鍵值 k,只有第乙個絕對值等於 k 的結點被保留。同時,所有被刪除的結點須被儲存在另乙個鍊錶上。例如給定 l 為 21→-15→-15→-7→15,你需要輸出去重後的鍊錶 21→-15→-7,還有被刪除的鍊錶 -15→15。

input:

輸入在第一行給出 l 的第乙個結點的位址和乙個正整數 n(≤10​5​​,為結點總數)。乙個結點的位址是非負的 5 位整數,空位址 null 用 −1 來表示。

隨後 n 行,每行按以下格式描述乙個結點:

位址鍵值下乙個結點

其中位址是該結點的位址,鍵值是絕對值不超過10​的4次方的整數,下乙個結點是下個結點的位址。

output:

首先輸出去重後的鍊錶,然後輸出被刪除的鍊錶。每個結點佔一行,按輸入的格式輸出。

樣例煩請大家在原題上檢視。

思路:

題目雖然叫做鍊錶去重,其實根本不是傳統意義上的鍊錶,但我們可以模擬出記憶體的儲存結構(記憶體是連續的,而鍊錶是不連續的,鍊錶的每個結點都存有下乙個結點的位址資訊)。開乙個足夠大的陣列p就可以模擬出記憶體(因為陣列是順序儲存的),陣列p的下標就代表該元素(結點)的位址。

鍊錶結點的刪除比較簡單,學過鍊錶這種資料機構的人都知道(沒學過的建議去補鍊錶的相關知識)。難點在於如何構造被刪除的結點組成的鍊錶。設定乙個整型變數shanchu用來儲存被刪除部分構成的鍊錶的頭結點的位址,設定另乙個整型變數shanchu2用來儲存最後乙個結點的位址。有了以上鋪墊後面的操作就很方便了。

上ac**:

#include typedef struct

pos;

//結點 下標表示位址

pos p[100000];

//儲存這個絕對值出現了幾次

int dp[10001];

//儲存被刪部分組成的煉表頭結點位址的陣列

int shanchu;

//儲存被刪部分組成的鍊錶最後乙個結點的位址

int shanchu2;

//首位址和結點總數

int firstadd,n;

int main()

else

p[temp].next=-1;

}else

//為下一步的遍歷指明方向

temp=p[pre].next;

}//遍歷刪除後的鍊錶

//printf("遍歷刪除後的鍊錶:\n");

temp=firstadd;

while(temp!=-1)

else

temp=p[temp].next;

}//遍歷被刪除的鍊錶

//printf("遍歷被刪除的鍊錶:\n");

天梯賽習題 L2 002 鍊錶去重

時間限制 300 ms 記憶體限制 65536 kb 長度限制 8000 b 判題程式 standard 作者 陳越 給定乙個帶整數鍵值的單鏈表l,本題要求你編寫程式,刪除那些鍵值的絕對值有重複的結點。即對任意鍵值k,只有鍵值或其絕對值等於k的第乙個結點可以被保留。同時,所有被刪除的結點必須被儲存在...

PAT天梯賽 L2 002 鍊錶去重 STL

題目鏈結 思路 用結構體 儲存 乙個結點的位址 值 和下乙個位址 然後從首位址開始 往下走 並且每個值的絕對值 都標記一下 並且 每次往下走的時候 都判斷一下 其值的絕對值 是否 已經被標記 如果被標記過 那麼 它就要加入到 重複的序列當中 如果 沒有被標記過 就要標記 然後加入到 未重複的序列 a...

L2 002 鍊錶去重

給定乙個帶整數鍵值的單鏈表l,本題要求你編寫程式,刪除那些鍵值的絕對值有重複的結點。即對任意鍵值k,只有鍵值或其絕對值等於k的第乙個結點可以被保留。同時,所有被刪除的結點必須被儲存在另外乙個鍊錶中。例如 另l為21 15 15 7 15,則你必須輸出去重後的鍊錶21 15 7 以及被刪除的鍊錶 15...