0

だから私はJavaのリンクされたリストからアイテムを削除しようとしています.私はJavaの事前定義されたLLを使用していませんが、私は自分自身で作業しています.

アイテムを削除するという概念は、リンクをたどり、リスト内のデータを 1 つずつ比較することです。

これが私が思いついたものですが、うまくいきません!

public void delStudent(int regN) {
    Node current = head;
    Node q = head;

    if (current.getStudent().getRegN() == regN) {
        head = head.link;
    }
        for (int i = 0; i < this.length() - 1; i++) {
            if (current.getStudent().getRegN() != regN) {
                current = current.link;
                q = current;
            }
        }
        q.link= current.link.link;

    }
4

3 に答える 3

1

リストが空の場合、最初に if ステートメントを実行すると、すぐに NullPointerException が発生します (current が null になるため)。通常、LinkedList の delete メソッドでは、サイズ == 0、サイズ == 1、およびサイズ > 1 の 3 つのケースを考慮する必要があります (ここで、サイズはリンク リスト内のノードの数です)。

public void delStudent(int regN) {
    Node current = head;
    Node previous = head;       
    while (current != null ){ // keep traversing till end of list
        if (current.getStudent().getRegN() == regN) { // found it!
            previous.link = current.link; // relink
            if (current == head){ // edge case : removed first element
                head = current.link; // move head forward.
            }
            break;
        } else {
            previous = current;
            current = current.link;
        }   
    }
}

上記のコードは、regN が一意であり、その regN を持つ学生が 1 人しかいないことを前提としています。お役に立てれば。

于 2013-10-30T17:13:56.847 に答える
0

各ノードをチェックしているときは、ノードを削除するか、一致が見つかったらブレークする必要があります。一致が見つかったら現在のノードを削除できるように、前のノードのノードを維持する必要があります。

Node q でそれをしようとしていることに気付きました

for (int i = 0; i < this.length() - 1; i++) {
    if (current.getStudent().getRegN() != regN) {
        q = current;
        current = current.link;           
    } else{ //we have a match
        //remove the link to the current item
        q.link = current.link; 
        break; 
    }

二重リンク リストを使用している場合は、node.prev().link = current.link; を使用できます。

于 2013-10-30T13:43:45.107 に答える