Entfernen Sie Duplikate aus einer unsortierten verketteten Liste
import java.util.*;
/*
* Remove duplicates from an unsorted linked list
*/
public class LinkedListNode {
public int data;
public LinkedListNode next;
public LinkedListNode(int data) {
this.data = data;
}
}
public class Task {
public static void deleteDups(LinkedListNode head){
Hashtable<Integer, Boolean> table=new Hashtable<Integer, Boolean>();
LinkedListNode previous=null;
//nth node is not null
while(head!=null){
//have duplicate
if(table.containsKey(head.data)){
//skip duplicate
previous.next=head.next;
}else{
//put the element into hashtable
table.put(head.data,true);
//move to the next element
previous=head;
}
//iterate
head=head.next;
}
}
public static void main (String args[]){
LinkedList<Integer> list=new LinkedList<Integer>();
list.addLast(1);
list.addLast(2);
list.addLast(3);
list.addLast(3);
list.addLast(3);
list.addLast(4);
list.addLast(4);
System.out.println(list);
LinkedListNode head=new LinkedListNode(list.getFirst());
Task.deleteDups(head);
System.out.println(list);
}
}
Das Ergebnis: [1, 2, 3, 3, 3, 4, 4]
[1, 2, 3, 3, 3, 4, 4]
Beseitigt Sie nicht die Duplikate.
Warum nicht die Methode funktioniert?
stackoverflow.com/questions/9459557/...
Sie sind überhaupt nicht der Rückkehr die neue Liste von der
Ich schlage vor, Sie verwenden Sie Ihre debugger in der IDE Schritt für Schritt durch den code und verstehen. Wenn Sie nicht wissen, wie es zu benutzen, es ist nie zu spät zu lernen. Würde ich auch nicht verwenden, Hashtable, wie es ist ein Erbe der Klasse für die letzten 15 Jahre oder so. Sie sollten die Verwendung von einem Satz wie HashSet.
Ihre Liste ist nicht angeschlossen. Sie sind nur das hinzufügen von Knoten, sondern Ihre Funktion zurück, sofort, weil jedes element nicht ein "weiter" - Zeiger gesetzt
Sie sind überhaupt nicht der Rückkehr die neue Liste von der
deleteDups
Methode.Ich schlage vor, Sie verwenden Sie Ihre debugger in der IDE Schritt für Schritt durch den code und verstehen. Wenn Sie nicht wissen, wie es zu benutzen, es ist nie zu spät zu lernen. Würde ich auch nicht verwenden, Hashtable, wie es ist ein Erbe der Klasse für die letzten 15 Jahre oder so. Sie sollten die Verwendung von einem Satz wie HashSet.
Ihre Liste ist nicht angeschlossen. Sie sind nur das hinzufügen von Knoten, sondern Ihre Funktion zurück, sofort, weil jedes element nicht ein "weiter" - Zeiger gesetzt
InformationsquelleAutor Ivan | 2013-07-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Durchlaufen die verkettete Liste
hinzufügen jedes element in eine Hashtabelle. Wenn wir entdecken, ein doppeltes element, entfernen wir das element und die das fortsetzen des Durchlaufs. Wir können dies tun, alle in einem Durchlauf-da sind wir mit einer verlinkten Liste.
Folgende Lösung in O(n) Zeit, n die Anzahl der Elemente in der verknüpften Liste.
hat jemand schon das Lesen cracking the coding interview
Die entsprechende Datenstruktur, die hier verwendet werden ist ein HashSet und nicht eine Karte, und sicherlich keine Karte, die thread-sicher sind.
Was ist vorige verwendet für hier? Warum wird sowas wie unten nicht funktionieren? ~~~ public static void deleteDups (LinkedListNode n){ HashSet<Integer> set = new HashSet<Integer>(); while(n!=null){ if(set.containsKey(n.Daten)){ n=n.weiter } else { Tabelle.put(n)).Daten, true); n=n.next; } } } ~~~
InformationsquelleAutor user3000711
Den code unten läuft in O(1) Speicherplatz, aber O(N Quadrat) Zeit.
public void deleteDups(LinkedListNode Kopf){
}
Referenz : Gayle laakmann mcdowell
Es ist nicht die optimale Lösung, das ist, warum ist nicht die richtige Antwort.
Ich habe nie argumentiert, dass meine Lösung optimal ist (bereits erläutert in der Lösung). Nur weil die Lösung nicht optimal ist, bedeutet nicht, dass die Lösung nicht korrekt ist.
Diese gleiche Lösung ist in Cracking the coding interview
Rambo7, ich denke deine Lösung wird nicht funktionieren, wenn der doppelte-ist das Letzte element der Liste, wo die Läufer.next!=null-check schlägt fehl. Habe ich nicht getestet, aber probieren Sie etwas wie dieses: //0 1 2 3 4 1
InformationsquelleAutor Rambo7
Hier sind zwei Möglichkeiten, dies zu tun, in java. die Methode oben funktioniert in O(n) erfordert jedoch zusätzlichen Speicherplatz. Wo da die zweite version läuft in O(n^2), aber benötigt keinen zusätzlichen Platz.
InformationsquelleAutor Peter
Ans in C . zuerst sortierte link-Liste mit sort() in nlog Zeit und dann gelöscht, doppelte del_dip() .
InformationsquelleAutor Aditya_G
Versuchen Sie dies, es ist die Arbeit für löschen der doppelten Elemente aus der linkedList
Abgesehen von der Verwendung der JAVA-API hinzufügen, die Liste zu setzen, wird die Sortierung der Elemente. Dies steht im Widerspruch zu der Problematik, der Umgang mit der UNSORTIERTEN Liste.
InformationsquelleAutor loknath
}
InformationsquelleAutor Big_t boy
Können Sie die folgende java-Methode remove duplicates:
1) Mit
complexity
von O(n^2)Eingang:1=>2=>3=>5=>5=>1=>3=>
Ausgabe:1=>2=>3=>5=>
2)Mit
complexity
von O(n) mit hash-Tabelle.Eingang:1=>2=>3=>5=>5=>1=>3=>
Ausgabe:1=>2=>3=>5=>
InformationsquelleAutor Prateek Joshi
Das erste problem ist, dass
eigentlich nicht initialisieren
head
mit dem Inhaltlist
.list.getFirst()
gibt einfach die Integer -1
, undhead
enthält1
als einziges element. Sie hätte zu initialisierenhead
durch Durchlaufenlist
um alle Elemente.Darüber hinaus, obwohl
ändert
head
werden, lässt dieslist
völlig unverändert—es gibt keinen Grund, warum die änderungenhead
verbreiten sollten, umlist
. Daher, um zu überprüfen, Ihre Methode, Sie müssten die Schleife untenhead
und drucken Sie jedes element, eher als Ausdrucklist
wieder.InformationsquelleAutor ikdc
Versuchen.Ihre arbeiten.
//Entfernt Duplikate in der Verlinkten Liste
InformationsquelleAutor Veer
hier sind ein paar andere Lösungen, die geringfügig von Rissbildung Kodierung inerview, leichter zu Lesen, IMO).
}
}
InformationsquelleAutor alexD
Hier ist eine sehr einfache version.
Sehr prägnant. Ist es nicht?
InformationsquelleAutor Alex
Es ist einfach Weg, ohne HashSet oder die Schaffung von Knoten.
Und, um es zu überprüfen:
InformationsquelleAutor Den
InformationsquelleAutor Joe Sleiman
InformationsquelleAutor Gaya3
Folgenden code implementiert dies, ohne dass Sie alle temporären Puffer. Es beginnt mit dem Vergleich der ersten und zweiten Knoten, wenn nicht ein Spiel, es fügt char auf den ersten Knoten zum zweiten Knoten geht dann vergleicht man alle chars in der zweiten Knoten zu char am Dritten Knoten und so weiter. Nach comperison abgeschlossen ist, vor dem verlassen des Knotens, auf dem er löscht alles, was Hinzugefügt wird, und stellt die alten Werte, welche sich auf Knoten.val.char(0)
F > FO > FOL > (Spiel gefunden, Knoten.next = Knoten.weiter.next) > (wieder übereinstimmen, ersetzen Sie es) > FOLW > ....
InformationsquelleAutor Berk
Alle Lösungen gegeben oben sieht optimiert, aber die meisten von Ihnen definiert benutzerdefinierte Knoten als Teil der Lösung. Hier ist eine einfache und praktische Lösung, die mit Java LinkedList und HashSet, die nicht darauf beschränken, verwenden Sie die bereits vorhandenen Bibliotheken und Methoden.
Zeit-Komplexität : O(n)
Speicherplatz-Komplexität: O(n)
Diese behält auch der Reihenfolge der Liste.
InformationsquelleAutor Monil Panchal
1.Voll Dynamische Ansatz
2.Entfernen Sie Duplikate von LinkedList
3.LinkedList Dynamische Objekt-basierte Entwicklung
Danke
Eingang:
5
1 1 2 3 3
Ausgabe:
1 2 3
InformationsquelleAutor Asif Bilakhiya