Ich überprüfe einige Codeschnipsel für einen kommenden Test. Ich habe das in meinen Notizen gesehen und habe gerade gemerkt, dass dieser Code für Methode 1 keine Duplikate entfernt, wenn die Liste auf diese Weise A -> B -> C -> A ist. Ich habe eine alternative Funktion geschrieben (Methode 2) Ich denke, dass es funktionieren wird. Was denkt ihr? Funktioniert Methode 1 tatsächlich nicht und ich verfolge es falsch? p.s. Wir sind zu diesem Zeitpunkt keine Compiler erlaubt :)Entfernen von Duplikaten aus einer Linked-List in Java ohne die Verwendung von Extra-Puffer
Hier ist der Code, und eine kurze Einführung dessen, was es tun soll.
METHODE 1: Was ich denke, funktioniert nicht, wenn es 2 genaue Dinge an Kopf und Schwanz gibt. Code schreiben, um Duplikate aus einer unsortierten Liste OHNE Puffer zu entfernen. Wwe kann mit zwei Zeigern iterieren: "current" führt eine normale Iteration aus, während "runner" alle vorherigen Knoten durchläuft, um nach "dups" zu suchen. Runner wird nur einen Dup pro Knoten sehen, denn wenn mehrere Duplikate vorhanden wären, wären sie bereits entfernt worden.
public static void deleteDuplicates1(LinkedListNode head) {
if (head == null) return;
LinkedListNode previous = head;
LinkedListNode current = previous.next;
while (current != null) {
LinkedListNode runner = head;
while (runner != current) { // Check for earlier dups
if (runner.data == current.data) {
LinkedListNode tmp = current.next; // remove current
previous.next = tmp;
current = tmp; // update current to next node
break; // all other dups have already been removed
}
runner = runner.next;
}
if (runner == current) { // current not updated - update now
previous = current;
current = current.next;
}
}
}
Ich dachte, das würde funktionieren. Methode 2:
public void removeDuplicates2(){
Node current = null;
Node tracer = null;
for(current = head.next; current!=null; current=current.next){
for(tracer=head; tracer!=current; tracer=tracer.next){
if(tracer.data == current.data)
//DELETE THE NODE IN CURRENT
}
}
}
Leider habe ich vergessen, den ersten Satz, nachdem er durch sie zu lesen. Die Idee klingt aber nett.+1 – Muggen
Dies ist genau die Lösung, die ich gesucht habe! – Luis
@Lukas: Wenn Sie die verknüpfte Liste in einem HashSet platzieren, verlieren Sie die Reihenfolge der ursprünglichen verknüpften Liste. Ich sehe keine Lösung, die Duplikate aus der verknüpften Liste mit "In Place" -Stil entfernt und die Bestellung ebenfalls reserviert. Selbst wenn Sie mit merge sort sortieren, verlieren Sie die Aufträge. Zum Beispiel: Wenn die Originalverknüpfungsliste 'L: 1 - 3 - 4 - 2 - 4 - 1 - 5 - 3 - 6' ist, lautet die Antwort:' L: 1 - 3 - 4 - 2 - 5 - 6' – Darpan27