リンクリストでの1097重複排除(25ポイント)
整数キーを持つ単一リンクリストLが与えられた場合、キーの絶対値が重複しているノードを削除することになっています。つまり、各値Kについて、そのキーの値または絶対値がKに等しい最初のノードのみが保持されます。その間、削除されたすべてのノードは別のリストに保持する必要があります。たとえば、Lが21→-15→-15→-7→15の場合、21→-15→-7、および削除されたリスト-15→15を出力する必要があります。
入力仕様:
各入力ファイルには、1つのテストケースが含まれています。各場合について、最初の行は、最初のノードのアドレスと、正N(≤10含ま
5
ノードの総数です)。ノードのアドレスは5桁の非負の整数であり、NULLは-1で表されます。
次に、N行が続き、それぞれが次の形式でノードを記述します。
Address Key Next
ここで、Addressはノードの位置、Keyは絶対値が10
4以下の整数
、Nextは次のノードの位置です。
出力仕様:
いずれの場合も、最初に結果のリンクリストを出力し、次に削除されたリストを出力します。各ノードは1行を占め、入力と同じ形式で出力されます。
サンプル入力:
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
#include<bits/stdc++.h>
using namespace std;
const int maxN=100010;
struct Node{
int address,data,next;
int order=2*maxN;
}node[maxN];
int hashTable[maxN]={
false};
int countValid=0,countRemoved=0;
bool cmp(Node n1,Node n2){
return n1.order<n2.order;
}
int main(){
int first,n;
cin>>first>>n;
int address;
for(int i=0;i<n;++i){
scanf("%d",&address);
scanf("%d%d",&node[address].data,&node[address].next);
node[address].address=address;
}
while(first!=-1){
if(hashTable[abs(node[first].data)]){
node[first].order=maxN+countRemoved;
countRemoved++;
}
else{
node[first].order=countValid;
hashTable[abs(node[first].data)]=true;
countValid++;
}
first=node[first].next;
}
sort(node,node+maxN,cmp);
for(int i=0;i<countValid+countRemoved;++i)//可能有不在链表上的,不能写i<n
if(i!=countValid-1&&i!=countValid+countRemoved-1)
printf("%05d %d %05d\n",node[i].address,node[i].data,node[i+1].address);
else
printf("%05d %d -1\n",node[i].address,node[i].data);
}