0

パーティーに招待されたゲストの LinkedList があります。ゲストの 1 人を別の人と交換したい。そのために、削除する人をリストから検索して削除し、新しい人をリストの先頭に追加しています。

これまでの私の置換方法は次のとおりです。

public void replace(String n, String rn, String rf){
  boolean match = false;
  GuestNode curr = GuestList;
  GuestNode replace = new GuestNode(rn,rf);
  GuestNode onemore, twomore;

  while (match == false && curr != null){
     if (curr.getLink().getName().equals(n)){
        onemore = curr.getLink();
        twomore = onemore.getLink();
        curr.setLink(twomore);
        match = true;
     }
     else
        curr = curr.getLink();
  }

  if (match){
     GuestList = curr;
     addNode(replace);
     System.out.println(n+ " has been replaced with " +rn+ ".");
  }
  else
     System.out.println(n+ " was not found.");
}

私の問題は、それを実行すると、元の人を見つけて削除し、新しい人をリストの先頭に追加できることですが、残りは失われ続けます。これが私が得ている出力です(太字のユーザー入力):

次のオプションのいずれかを入力してください: 並べ替え、検索、置換、削除、印刷、印刷
終了

10 人が参加しており、10 人のアイスクリームが好きです。
ナインが参加しており、9人のアイスクリームが好きです。
エイトが出席し、彼らはエイトのアイスクリームが好きです。
セブンが通っていて、セブンのアイスクリームが好きです。
6 人が参加しており、6 人のアイスクリームが好きです。
5 人が参加しており、5 人のアイスクリームが好きです。
4 人が参加しており、4 人のアイスクリームが好きです。
3 人が参加しており、3 人のアイスクリームが好きです。
2 人が参加しており、2 人のアイスクリームが好きです。
1 人が参加しており、彼らは 1 つのアイスクリームが好きです。

次のオプションのいずれかを入力してください: 並べ替え、検索、置換、削除、印刷、
置換の終了

誰を削除しますか? 3
代わりに誰を入れたいですか? また、好きなアイスクリームのフレーバーは何ですか?
THIRTYTHREE 33
three は THIRTYTHREE に置き換えられました。

次のオプションのいずれかを入力してください: 並べ替え、検索、置換、削除、印刷、印刷
終了

THIRTYTHREE が出席し、33 のアイスクリームが好きです。
4 人が参加しており、4 人のアイスクリームが好きです。
2 人が参加しており、2 人のアイスクリームが好きです。
1 人が参加しており、彼らは 1 つのアイスクリームが好きです。

私はこれを数時間扱ってきましたが、間違いがどこにあるのかわかりません。助けてください!

編集:問題がそこにある場合に備えて、これが私のGuestNodeのコードです。

public class GuestNode{
    private String name;
    private String fav;
    private GuestNode link;

    public GuestNode(String n, String f){
        this.name = n;
        this.fav = f; 
        link = null;
    }

    public String toString(){
        return this.name +" is attending, and they like "+ this.fav +" ice cream.";
    }

    public String getName(){ return this.name; }
    public String getFav(){ return this.fav; }
    public GuestNode getLink(){ return this.link; }
    private void setName(String n){ this.name = n; }
    private void setFav(String f){ this.fav = f; }
    public void setLink(GuestNode l){ this.link = l; }

    public void clear(){
        this.link = null;
    }
}
4

2 に答える 2

2

GuestListそれが最初のノードであると仮定すると、問題は次のとおりです。

GuestList = curr;

currこれにより、リストの最初のノードが作成され、リストの先頭が切り捨てられます。

また、特殊なケースでもコードが機能することを確認してください (最初のノードを置き換えたい場合はどうなりますか?)

于 2013-11-05T18:36:42.990 に答える
2

実際のノード コードはここには示されていませんが、問題はそこにあります。リンクされたリストがどのように機能するかを見落としました。

各ノードは次のノードにリンクしているため、単純にノードを削除すると、それらのノードへの参照がなくなるため、そのノードの背後にあるすべてのノードも削除されます。各ノードは次のノードのみを格納し、それ以上は格納しません。そのため、それらの他のノードを指すものは何も残されていません。

リンクされたリストからノードを適切に削除するには、そのノードを削除するだけでなく、そのノードの BEFORE ノードを更新して、そのノードの AFTER ノードを指すようにする必要があります。作成した穴を「パッチ」して、チェーンを再接続する必要があります。

長いチェーンを想像してみてください。リンクの 1 つを取り出したところです。他に何もしなければ、チェーンは 2 つの断片、2 つの別個のチェーンになります。リンクを削除するには、前後の 2 つのリンクを結合する必要があります。

A -> B -> C -> D -> E C を削除

A -> B_D -> E 二連鎖!2 つ目は失われ、D への参照はありません。

結果が次のようになるようにパッチを適用する必要があります

A -> B -> D -> E

于 2013-11-05T18:31:42.893 に答える