problem description:
給定乙個帶整數鍵值的鍊錶 l,你需要把其中絕對值重複的鍵值結點刪掉。即對每個鍵值 k,只有第乙個絕對值等於 k 的結點被保留。同時,所有被刪除的結點須被儲存在另乙個鍊錶上。例如給定 l 為 21→-15→-15→-7→15,你需要輸出去重後的鍊錶 21→-15→-7,還有被刪除的鍊錶 -15→15。
input:
輸入在第一行給出 l 的第乙個結點的位址和乙個正整數 n(≤105,為結點總數)。乙個結點的位址是非負的 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...