1

これは私がすでに提出した古い宿題の問題によるものですが、私はそれを理解することができませんでした。ユーザー定義クラスを使用して、特定のインデックスのLinkedListから要素を削除しようとしています。以下は私が作業している擬似コードですが、それは私のものと同じパラメーターを持っていないので、それを変更しようとしましたが、問題がありました。私はプログラミング初心者(約6か月の経験)です。参考までに。ArrayListsは問題なく理解できますが、LinkedListsが問題を引き起こしています。

/*
 * Remove the nth element in the list.  The first element is element 1.
 * Return the removed element to the caller.

    function remove(List list, Node node)
        if node.prev == null
            list.firstNode := node.next
        else
            node.prev.next := node.next
        if node.next == null
            list.lastNode := node.prev
        else
            node.next.prev := node.prev
        destroy node
 */

私のメソッドは、削除するインデックス位置を入力するようにユーザーに要求します。intとLinkEntryはタイプが異なるため、当然問題が発生します。パラメータを介して渡されるintを組み込む方法がわかりません。

public void remove(int n)
{
    LinkEntry<E> remove_this = new LinkEntry<E>();
    remove_this.element = n;

    for (remove_this = head; remove_this != null; remove_this = remove_this.next)
    {
        //removes the head if list is only 1 item long
        if (head.next == null)
            head = remove_this.next;
        else
            //sets previous element to the next element
            remove_this.previous.next = remove_this.next;

        //if nothing comes after remove_this, then remove the tail element
        if (remove_this.next == null)
            tail = remove_this.previous;
        else
            //sets next previous element to current previous element
            remove_this.next.previous = remove_this.previous;  
    }
}

私が解決しようとしているものにもっと似ている別の例を与える場所を知っているなら、私はそれを本当に感謝します。私は自分のテキストとオンラインを調べましたが、運がありません。

4

2 に答える 2

0

遥か彼方の銀河系でこれを学んだとき、紙に描くのに役立ちました。このようなもの:

あなたが持っている

              A       B       C
 next         *------>*------>*---->NULL
 prev NULL<---*<------*-------*

そしてあなたが欲しい

              A       C       
 next         *------>*---->NULL
 prev NULL<---*<------*

したがって、B が見つかった場合は、何をすべきかがわかります。しかし、どうやってBを見つけますか?上記の例では B が 2 番目の要素であるため、0 から始まるリストでは「1」、1 から始まるリストでは「2」が与えられます。典型的なシナリオは、リストの最初の要素への参照を保持することです。これはしばしば「頭」と呼ばれます。ここで、その頭から始めて、その - ポインターをnextたどります。あなたは何を得ますか?リストの 2 番目の要素。この例では、それはすでに「B」です。1 回フォローしたことに注意してくださいnext...ここで、C を削除すると仮定します。インデックス 2 (または 1 ベース: 3) を取得し、head で開始し、next1 回フォローして B を取得しました。1<2 なので、フォローします。nextまた。「head」の代わりに B の next をたどる必要があることに注意してください。したがって、ループを使用する場合は、ある種のローカル var を使用する必要があります。これで、C である 2 番目の要素があり、それを削除します。C の「次」が であることに注意してくださいnull。それで、私たちはその方向で終わりました。

于 2012-10-06T21:23:58.610 に答える
0

カウンターをゼロに設定し、リンクされたリストをその最初の要素 (明らかに「head」という名前) から参照し、n に等しくなるまで (またはリストの最後に到達するまで) カウンターをインクリメントする必要があります。

カウンタが n に等しい場合、前のエントリを次のエントリに接続し、次のエントリを前のエントリに接続する必要があります (したがって、N 番目のエントリが切断されます)。また、n=1 の場合 (「head」エントリを削除する必要がある場合、つまり head を head.next に設定する場合)、next が null (n = リストの長さ) の場合、および特殊なケースにも注意する必要があります。 n が負の場合、またはリストの長さより大きい場合。

于 2012-10-06T20:56:20.880 に答える