0

割り当て用の LinkedList クラスを作成していて、挿入メソッドを作成していて、それを確認できるかどうか疑問に思っていました。

private Node first;     // start of the list

private class Node {
    private Item item;
    private Node next;
}

public boolean insert(Item item) {
    // add item to list if it doesn't already exist
    // return true if a new Node is created, otherwise false
    if ( first.next == null && first.item == item) {
        return false;
    }
    Node ptr = first;
    while (ptr.next != null) {
        if (ptr.item == item) {
            return false;
        }
        ptr = ptr.next;
    }
    Node oldFirst = first;
    first = new Node();
    first.item = item;
    first.next = oldFirst;
    return true;
}

ほとんどの場合、問題ないと思いますが、insert メソッドをトレースしようとするたびに、自分自身を混乱させ、すべての参照の変更を台無しにしてしまいます。私がそれを正しく行っているかどうか誰かに教えてもらえますか? 他の改善点も高く評価されます。

4

2 に答える 2

0

Item が既にリストにあるかどうかを確認するための追加の関数を作成することを検討します。これにより、挿入機能がより明確になり、参照の変更全体がそこにあるだけになります。また、最初のテスト:

if ( first.next == null && first.item == item) {
    return false;
}

while ループの最初の繰り返し以外は何もしません。

@threenplusoneが言ったようにNullPointerExcpetionをスローしないように、最初に必ず初期化するか、次のことを確認する必要がありますfirst == null。(while ループの最初の ptr.next は、first が null の場合、NPE をスローします) また、@Thilo が言ったように、アイテムを equals で比較する必要があります。

あとは正しいと思います。

于 2012-11-15T06:48:13.057 に答える
-1

挿入メソッドは OO ではありません。whileループを使用してリストをトラバースしているため、このメソッドはメソッドである可能性がありstaticます (最初のノードも渡した場合)。

よりエレガントな方法は次のとおりです。

擬似コード:

insert(item) {
    if (next == null)
        add item to "this" // we are at end of list
    else
        next.insert(item) // hand item to the next node
}
于 2012-11-15T05:12:09.353 に答える