2
public void deleteItem(int target) 
{
    int index = 0;
    CarNode item = head;

    while(item != null)
    {

        CarNode next = (item.node).node;
        CarNode previous = item;

        if (index == target)
        {

            previous.setNode(next);

        }

    item = element.node
    index++;

    }
}

ええ、よく理解できたかどうかわかりませんが、参照を使用でき、連結リストの変更を行うために連結リストのオブジェクトを直接参照する必要はないと言われました。

ノードには Car オブジェクトと LinkedList の別の要素のノードが含まれているため、参照は基本的にオリジナルと同じオブジェクトを指すクローンですが、オリジナルが無視され、参照が優先されるのはなぜですか?参照のノードを変更すると元の? 申し訳ありませんが、私には意味がわかりませんでした。これについて何時間も頭を悩ませてきました。

4

2 に答える 2

1

コードは次のようになります。

public void deleteItem(int target) 
{
    int index = 0;
    CarNode item = head;
    CarNode prev = null;

    while(item != null)
    {
        if (index == target) {
            if (prev == null) {
                head = item.getNode();
                return; // We've removed the target.
            } else {
                prev.setNode(item.getNode());
                return; // We've removed the target.
            }
        }
        prev = item;
        item = item.getNode();
        index++;
    }
}

それでは、これを分解しましょう:

int index = 0;
CarNode item = head;
CarNode prev = null;

2 つの変数が必要です。1 つは見ている要素を格納するためのもので、もう 1 つは前の要素を格納するためのものです (要素を削除したら、リストを再接続するために使用します)。まず、現在は頭であり、以前は存在しません。index目標に到達したらお知らせします。

while(item != null)

nullノードでマークされたリストの最後に到達するまで繰り返します。

if (index == target) {
    if (prev == null) {
        head = item.getNode();
        return; // We've removed the target.
    } else {
        prev.setNode(item.getNode());
        return; // We've removed the target.
    }
}

ターゲットが見つかった場合は、それを削除します。previous が null の場合、ターゲットは頭だったので、頭を 2 番目の要素に移動します。それ以外の場合は、前のノードの参照を現在のノードの参照にします。これにより、現在のノードがリストから除外されます。ターゲットを削除したら完了なので、戻ります。

prev = item;
item = item.getNode();
index++;

以前のノードと現在のノードを更新します。どちらも 1 つのノードを進めます。インデックスがインクリメントされます。

図示された例はどうですか:

サイズ 3 のリストを取得します。次のようになります。

1

これで aとノードをlist.deleteItem(1);インスタンス化します。最初のノードを指し、null です。prevnextnextprev

2

ターゲットは 1 なので、次のノードに移動します。は、以前prev指していたものを指し、リストの 2 番目のオブジェクト (削除したいオブジェクト)を指します。nextnext

3

prevノードの参照をノードの参照に設定することで、これを削除しnextます。

4

メソッドから戻ると、Java ガベージ コレクションが機能し、次のものが残ります。

5

多田!ノードがリストから削除されました!

于 2013-03-31T04:46:41.787 に答える
1
public void deleteItem(int target) 
{
    int index = 0;
    CarNode item = head;

    CarNode next = null;
    CarNode previous = null;

    // stop when the linked-list ends
    while(item != null)
    {
        // the tail has no next node
        if (item.node != null)
            next = item.node.node;
        else
            next = null;

        // if targetIndex exist, remove it
        //     "logically" from the linekd-list
        if (index == target)
        {
            previous.setNode(next);
            break;
        }

        // today is tomorrow's yesterday
        previous = item;
        item = item.node;
        index++;

    }
}
于 2013-03-31T04:50:17.723 に答える