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
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. –