PAT鍊錶去重

2021-07-29 05:23:25 字數 1499 閱讀 2444

時間限制

300 ms

記憶體限制

65536 kb

**長度限制

8000 b

判題程式

standard

作者 陳越

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

輸入格式:

輸入第一行包含鍊錶第乙個結點的位址、以及結點個數n(<= 105 的正整數)。結點位址是乙個非負的5位整數,null指標用-1表示。

隨後n行,每行按下列格式給出乙個結點的資訊:

address key next

其中address是結點的位址,key是絕對值不超過104的整數,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

思路:用陣列模擬鍊錶,但是遇到重複值時,更改節點的next指標是很麻煩的,但是我們可以用乙個陣列來標記沒有重複出現的下標和被刪除的鍊錶的下標。當需要輸出當前結點的next節點時用標記的下乙個節點的當前位址代替就會方便許多。

#include#include#include#include#includeusing namespace std;

struct node

a[100005];

int k1[100005],k2[100005];

int m1[100005],m2[100005];

int main()

memset(m1,0,sizeof(m1));

memset(m2,0,sizeof(m2));

int len1=0,len2=0;

for(i=s; i!=-1; i=a[i].next)

else

}printf("%05d %d ",k1[0],a[k1[0]].add);

for(i=1; icout<<"-1"

cout<<"-1"<}

return 0;

}

PAT 鍊錶去重

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

PTA 鍊錶去重

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

鍊錶去重(PTA)

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