2016-04-06 9 views
0

Ich habe Probleme herauszufinden, wie man einen Knoten des ersten Vorkommens entfernt.(Java) Doppelt verknüpfte Liste, Entfernen des ersten Vorkommens.

So weit ist hier mein Code zum Entfernen des ersten Vorkommensknotens.

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; 
     } 

    } 
} 

Hier ist der Code für das Entfernen zuletzt:

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; 
    } 
} 

Hier ist der Code zuerst zum Entfernen:

public E removeFirst() 
{ 
    if (head == null) 
     throw new NoSuchElementException("Cannot removeFirst from empty list"); 
    else if (head == tail) 
    { 
     E firstOne = head.data;  
     head = tail = null; 
     return firstOne; 
    } 
    else 
    { 
     E firstOne = head.data;  
     head = head.next; 
     head.prev = null; 
     return firstOne; 
    } 
} 

Wenn ich meine Treiber laufen, die (4, 5, 6 ,5, 7, 6) hinzufügen. Von dort sage ich ihm, die erste 6 zu entfernen. Was ich bekommen sollte ist eine (4, 5, 5, 7 ,6) nach der .next Verbindung (die ich bekomme), und nach der .prev Link sollte ich (6, 7, 5, 5, 4) bekommen. Stattdessen erhalte ich (6, 7, 4).

Allerdings, wenn ich die cursor.next.next.prev = cursor.prev; und cursor.prev = cursor.prev.prev; entfernen Die .prev Link geht zurück zum Original, aber nur rückwärts. Was bedeutet, dass meine Logik zum erneuten Verbinden der .prev Verbindung inkorrekt ist.

Kann mir bitte jemand helfen mit der Logik zum erneuten Verbinden der. prev verbinden, indem Sie den Knoten umgehen.

Danke. Diese

+0

Holen Sie sich Stift und Papier, und durchlaufen Sie den Code, den Sie selbst geschrieben haben, als wären Sie der Computer, mit einer kurzen Liste als Eingabe. Was wird erstellt und was passiert mit den vorherigen/nächsten Zeigern, wenn Sie das Szenario "Vorfall entfernen" manuell durchlaufen? Sie brauchen uns nicht, um Ihnen dabei zu helfen, dieses Problem zu lösen. Sie müssen sich nur ein wenig Zeit nehmen, um Ihren Code durchzugehen, anstatt ihn in einem Texteditor zu betrachten. –

Antwort

0

:

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

Sollte auf diese geändert werden:

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

Da Cursor ist die Position vor dem Element entfernt. I.e. Wenn Sie AB und C haben und Sie B entfernen, sollte der nächste von A zu C werden und der vorherige von C sollte zu A.

Beachten Sie, dass dieser Code nicht getestet ist, aber es sollte funktionieren - lassen Sie mich wissen, wenn nicht und ich werde Hilfe mehr.

+0

Oh ... Ich verstehe, warum mein Code falsch war. Wenn ich den Code 'cursor.next = cursor.next.next;' habe, gibt es laut dem '.next'-Link kein B, sondern nur (A, C). Von da an sage ich es einfach dem Cursor, dem '.next' und dann' .prev' zu folgen. Die ganze Zeit über denke ich, dass B da drin war, bis alle Links B umgangen haben. Danke. – h7779

+0

Kein Problem, gerne helfen – nhouser9

Verwandte Themen