リンクリストでの1097重複排除(25ポイント)

リンクリストでの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);
}

おすすめ

転載: blog.csdn.net/weixin_44970602/article/details/111875481