2016-04-06 11 views
0

最初のオカレンスノードを削除する方法を調べるのに問題があります。(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リンクを使用して、ノードをバイパスします。

ありがとうございました。

+0

ペンと紙を手に入れて、コンピュータのように短いリストを入力して、自分で書いたコードを実行します。それは何を構築し、あなたは手動で "最初の発生の除去"のシナリオを実行するときに、あなたの前/次のポインタに何が起こっていると思いますか?これを理解する手助けは私たちには必要ではありません。テキストエディタでテキストを見るのではなく、コードを実行するだけの時間が必要です。 –

答えて

0

この:要素を削除する前にカーソルが位置なので

cursor.next = cursor.next.next; 
cursor.next.prev = cursor; 

cursor.next = cursor.next.next; 
cursor.next.next.prev = cursor.prev; //<---Stuck here. 
cursor.prev = cursor.prev.prev;  //<---And here. 

はこれに変更する必要があります。私。あなたがABとCを持っていて、Bを取り除いているならば、Aの次はCになり、Cの前はAになります。

このコードはテストされていませんが、うまくいくはずです。もっと助けてください。

+0

ああ...なぜ私のコードが間違っているのか分かります。 'cursor.next = cursor.next.next;'というコードがあるとき '.next'リンクによれば、Bはまったくありません(A、C)。それから、そこから '.next'に続いて' .prev'に戻るようにカーソルに指示します。今度はBがすべてのリンクをバイパスするまでそこにいると思っています。ありがとうございます。 – h7779

+0

問題ありません、喜んで助けてください – nhouser9

関連する問題