最初のオカレンスノードを削除する方法を調べるのに問題があります。(Java)二重リンクリスト、最初の発生の削除。
ここまでは、最初のオカレンスノードを削除するためのコードです。
私は私のドライバを実行
、(4, 5, 6 ,5, 7, 6)
を追加します。
ここ
public E removeLast()
{
if (tail == null)
throw new NoSuchElementException("Cannot removeFirst from empty list");
else if (head == tail)
{
E firstOne = head.data;
head = tail = null;
return firstOne;
}
else
{
E lastOne = tail.data;
tail = tail.prev;
tail.next = null;
return lastOne;
}
}
が最初取り除くためのコードである:ここで
public boolean remove(E doomedElt)
{
if (head == null)
return false;
else if (doomedElt.equals(head.data))
{
removeFirst();
return true;
}
else
{
DLLNode<E> cursor = head;
while(cursor.next != null && !cursor.next.data.equals(doomedElt))
cursor = cursor.next;
if (cursor.next.next == null && cursor.next.data.equals(doomedElt))
{
removeLast();
return true;
}
else
{
cursor.next = cursor.next.next;
cursor.next.next.prev = cursor.prev; //<---Stuck here.
cursor.prev = cursor.prev.prev; //<---And here.
return true;
}
}
}
は最後取り除くためのコードです。そこから最初に
6
を削除するように指示します。私が得ようとしているのは
.next
リンクの後に
(4, 5, 5, 7 ,6)
であり、
.prev
リンクの後には
(6, 7, 5, 5, 4)
になるはずです。代わりに、私は
(6, 7, 4)
を得ています。
ただし、cursor.next.next.prev = cursor.prev;
とcursor.prev = cursor.prev.prev;
を削除した場合、.prev
のリンクは元に戻りますが、逆方向になります。つまり、.prev
リンクを再接続するロジックが正しくないことを意味します。
誰かが論理を使って再接続することができますか? prev
リンクを使用して、ノードをバイパスします。
ありがとうございました。
ペンと紙を手に入れて、コンピュータのように短いリストを入力して、自分で書いたコードを実行します。それは何を構築し、あなたは手動で "最初の発生の除去"のシナリオを実行するときに、あなたの前/次のポインタに何が起こっていると思いますか?これを理解する手助けは私たちには必要ではありません。テキストエディタでテキストを見るのではなく、コードを実行するだけの時間が必要です。 –