Gewusst wie: vergleichen von ints gespeichert in verknüpften Listen Java
Ich bin auf der Suche nach einige Ratschläge auf eine Java-Zuordnung. Was ich fragte zu tun ist, führen Sie verschiedene Operationen auf zahlen, die gespeichert werden in einer verknüpften Liste, die mit jeder Ziffer in einem separaten Knoten. Der Punkt ist, ein Programm zu schreiben, das kann arithmetische Operationen auf zahlen, die sind sehr sehr groß.
Dem besonderen problem, dass ich bin auf der Suche nach Hilfe ist für das schreiben eine Methode, die vergleicht zwei zahlen, ähnlich den regulären compareTo () - Methode mit int-Werten. Es sollte -1 zurückgeben, wenn diese.num < num, +1 wenn dieser.num > num -, und 0, wenn Sie gleich sind.
Was macht das schwierig für mich ist die Tatsache, dass die Zuordnung gibt an, dass die verknüpften Listen speichern sollten die zahlen in umgekehrter Reihenfolge. Zum Beispiel die verknüpfte Liste für die Nummer 145 würde wie folgt Aussehen:
5 => 4 => 1 => null
Dies macht es einfacher, hinzufügen von zahlen zusammen, aber es macht es Kopfschmerzen für mich, wenn versucht wird, zu vergleichen. Hier ist, was ich mir ausgedacht habe, die Kommentare erklären, wie es funktionieren sollte.
public int compareTo(LLNum list)
{ //Compares two numbers.
//If the two numbers are of a different length, clearly the shortest is the smallest.
//If the two numbers are of equal length, call traverseToCompare to do the comparison.
if (this.len > list.len)
{
compareResult = 1;
}
else if (this.len < list.len)
{
compareResult = -1;
}
else if (this.len == list.len)
{
traverseToCompare(this.head, list.head);
}
return compareResult;
}
public void traverseToCompare(ListNode node1, ListNode node2)
{ //In the case that both numbers are of the same length, recursively traverse the list.
//compare each digit individually while unwinding the stack.
//Once two digits are found to be different, break out of the unwinding (Note: I could not find a way of breaking out)
//Since the dominant digit is at the tail end, this ensures the least number of comparisons.
if (node1 == null || node2 == null)
{ //Base case. Handles the case where both numbers are identical.
compareResult = 0;
return;
}
traverseToCompare(node1.getNext(), node2.getNext());
if (node1.getItem() > node2.getItem())
{
compareResult = 1;
}
if (node1.getItem() < node2.getItem())
{
compareResult = -1;
}
return;
}
Die zahlen in umgekehrter Reihenfolge ist, was zog mich in Richtung der Rekursion. Ich dachte, ich würde rekursiv Durchlaufen der Liste und vergleichen Sie dann die einzelnen Ziffern auf dem Weg nach draußen, und irgendwie brechen Sie aus der Rekursion auf die ersten Ziffern sind nicht das gleiche. Ich weiß, dies ist nicht die gewöhnliche Weise, Rekursion zu verwenden, aber ich war mir nicht sicher wie sonst, es zu tun. Gibt es eine Möglichkeit, ich könnte brechen, ohne nur eine Ausnahme werfen? Ich denke, dass könnte ein wenig zu schlampig. Oder irgendwelche Vorschläge, wie dies zu tun, ohne Rekursion?
Bitte gib mir nicht nur einige code zu kopieren und einzufügen. Ich bin gerade auf der Suche zu sein, wies in die richtige Richtung. Danke!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn ich dies tun musste ich würde zuerst die Längen der beiden Listen (wie du hast). Wenn Sie gleich einen besseren Weg zu tun, der Vergleich wäre z.B. ein iterator für jede Liste. Sie können dann erhöhen Sie die Iteratoren in der gleichen Zeit und vergleichen Sie die Werte an, die position in der verketteten Listen. Doing es auf diese Weise, können Sie einfach aufhören zu vergleichen, die Listen, sobald Sie festgestellt haben, dass der eine enthält eine größere Anzahl als die andere.
In traverseToCompare Sie brauchen zu kümmern einigen Fällen.
Es wird besser sein, und reinigen Sie Sie, wenn Sie nicht mit der Rekursion.
Kann Folgendes eine Lösung sein
Der beste Weg, es zu tun, ist zum Durchlaufen der Liste für jede Zahl und konstruieren die Zahl vergleichen und dann die 2 zahlen.
Den Weg zu konstruieren, die eine Zahl aus der Liste wäre
ZB. wenn die Zahl 145, dann würde die Liste 5->4->1
Also mit den obigen code
So kommt es bei i = 145.
Wäre es viel einfacher gewesen, zu tun, mit einfacher String, wie Sie der Speicherung von Daten beliebiger Länge. Aber wie auch immer die Anforderung ist für LinkedList :
Nun, wie die Daten gespeichert werden, im revers um; das heißt, Sie können sich nicht entscheiden, Antwort von
compareTo
Methode, bis Sie gehen durch die gesamte Liste, die als bedeutendste Daten gespeichert sind, an letzter Stelle.So Lesen, durch die ganzen Beine; dann können Sie Sie speichern den Wert in eine String und dann entscheiden
compareTo
Ergebnis einer Methode.traverseToCompare - Methode aufgerufen wird, für die gleiche Länge der Elemente. So können Sie schreiben Sie Ihren eigenen Algorithmus für den Vergleich von zwei zahlen gespeichert, die in String.
Bearbeiten
Wenn die Zeichenfolge nicht zulässig
Dann werden Sie vorschlagen, das gleiche zu tun, manuell; Durchlaufen der gesamten Liste zu vergleichen, die letzten Knoten, wenn der Letzte Knoten ist der gleiche dann vergleichen Sie die vorherigen Knoten und so weiter...