1

ユーザーが入力したインデックスによって、双方向にリンクされたリストのノードを削除しようとしています。私には理にかなっているように思えますが、「ノードを削除」してリストの内容を再印刷した後、何も変わっていません。私が見逃しているのはばかげていると確信しています。何かアドバイス?

public void removeEntryNode() {
    System.out
            .println("We delete by index here. Type in the number you want to delete");
    // print list for selection
    temp = head;
    while (temp != null && temp.getFirstName() != null) {
        System.out.print(temp.getIndex() + " " + temp.getFirstName() + " ");
        System.out.print(temp.getLastName() + " ");
        System.out.println(" ");
        temp = temp.getNext();
    }

    int selection = keyboard.nextInt();

    // Gets node matching index with selection and deletes it
    // Next two lines loop through list
    while (temp != null && temp.getIndex() != selection) {
        temp = temp.getNext();
    }

    // if it is the head
    if (selection == 0) {
        head = temp.getNext();
        temp.getNext().setPrev(null);
        temp.setNext(null);
        counter--;
    }
    // if it is the tail
    else if (selection == size()) {
        tail = temp.getPrev();
        temp.setPrev(null);
        temp.setNext(null);
        temp.getPrev().setNext(null);
        counter--;
    } else {
        temp.getPrev().setNext(temp.getNext());
        temp.getNext().setPrev(temp.getPrev());
        temp.setNext(null);
        temp.setPrev(null);
        counter--;
    }

    System.out.println("Successfully deleted ");
    menu();
}
4

3 に答える 3

3

コード全体を見ずに正確な問題を特定することは不可能です。

それにもかかわらず、私はあなたにいくつかの指針を与えます:

1.

... temp.getIndex() != selection ...

一般に、リンクされたリスト内の要素が独自のインデックスを追跡することはお勧めできません。インデックスを正しく保つために、すべての挿入または削除は、インデックスを更新するためだけにリストをトラバースする必要があります。

2.

    else if (selection == size()){

おそらく、ここにオフバイワン エラーがあります。

3.

        temp.setPrev(null);
        temp.setNext(null);
        temp.getPrev().setNext(null);

最後の行は . をスローすることが保証されていNullPointerExceptionます。

これらの問題を修正したら、デバッガーでプログラムをステップ実行して、各ステップで実際に何が起こるかを確認することをお勧めします。

于 2012-03-06T12:35:33.353 に答える
1

二重リンクリストには、前のものと次のものへの2つのポインターがあります。

そのノードを削除しようとしている場合は、previous.next ポイントをノードの next に設定し、next.previous をノードの previous に設定してください。

指標値の維持については、私も反対ですが、それが完璧にできればいいんです。

于 2012-03-06T12:51:02.263 に答える