整数のキー値を持つリンクリストLが与えられた場合、絶対値が繰り返されるキー値ノードを削除する必要があります。つまり、各キーKについて、絶対値がKに等しい最初のノードのみが保持されます。同時に、削除されたすべてのノードは別のリンクリストに保存する必要があります。たとえば、Lが21→-15→-15→-7→15の場合、重複排除後にリンクリスト21→-15→-7を出力し、削除されたリンクリスト-15→15を出力する必要があります。
入力フォーマット:
最初の行にあるLの最初のノードのアドレスと正の整数N(≤105、これはノードの総数)を入力します。ノードのアドレスは非負の5ビット整数であり、空のアドレスNULLは-1で表されます。
次のN行、各行は次の形式でノードを説明します。
次ノード
のアドレスキー値アドレスはノードのアドレス、キー値は絶対値が104を超えない整数、次ノードは次ノードのアドレスです。
出力形式:
重複排除後にリンクリストを最初に出力し、次に削除されたリンクリストを出力します。各ノードは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
私は自分で完全に書いて、2回合格しました。。サンプルをテストしたところ、いくつかのバグが修正されました。「すべてのノード値の絶対値が1度しか現れない」という状況が考慮されていないため、次のアドレスが出力され、最初の提出が18ポイントになるためです。結局のところ、下付き文字は範囲外ですが、間違った答えのプロンプトが表示されるかどうかは明確ではありません。コードはかなり理解しやすいはずです
#include <iostream>
#include <cmath>
using namespace std;
typedef struct{
int key;
int next;
}Node;
Node node[100001];
bool flag[100001] = {
false};
int no1[100001],no2[100001];
int main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
int first,n,pos;
cin >> first >> n;
for(int i = 0;i<n;i++){
cin >> pos;
cin >> node[pos].key >> node[pos].next;
}
int k = 0,p = 0;
for(int i = first;i!=-1;i = node[i].next){
if(!flag[abs(node[i].key)]){
flag[abs(node[i].key)] = true;
no1[k++] = i;
}else{
no2[p++] = i;
}
}
for(int i = 0;i<k-1;i++){
printf("%05d %d %05d\n",no1[i],node[no1[i]].key,no1[i+1]);
}
printf("%05d %d %d\n",no1[k-1],node[no1[k-1]].key,-1);
if(p){
for(int i = 0;i<p-1;i++){
printf("%05d %d %05d\n",no2[i],node[no2[i]].key,no2[i+1]);
}
printf("%05d %d %d\n",no2[p-1],node[no2[p-1]].key,-1);
}
return 0;
}