Wie reverse eine einfach verknüpfte Liste mit nur zwei Zeiger?
Ich würde gefragt, wenn es gibt ein paar Logik eine Umkehrung der verlinkten Liste mit nur zwei Zeigern.
Folgenden wird verwendet, um reverse die einfach verkettete Liste mit drei Zeigern, nämlich p, q, r:
struct node
{
int data;
struct node *link;
};
void reverse()
{
struct node *p = first,
*q = NULL,
*r;
while (p != NULL)
{
r = q;
q = p;
p = p->link;
q->link = r;
}
q = first;
}
Gibt es irgendeine andere Alternative zum umkehren der verlinkten Liste? was wäre die beste Logik umkehren eine einfach verknüpfte Liste, in Bezug auf die Zeit-Komplexität?
InformationsquelleAutor der Frage Madhan | 2009-11-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Alternative? Nein, dies ist so einfach, wie es kommt, und es gibt keine grundsätzlich-anderen Weg, es zu tun. Dieser Algorithmus ist bereits O(n) Zeit, und man kann nicht schneller als das, wie Sie ändern müssen alle Knoten.
Es sieht aus wie Sie Ihren code auf der richtigen Spur, aber es ist nicht ganz der Arbeit in das Formular. Hier eine funktionierende version:
InformationsquelleAutor der Antwort
Ich hasse es der überbringer schlechter Nachrichten, aber ich glaube nicht, dass Ihr drei-Zeiger-Lösung tatsächlich funktioniert. Wenn ich es in der folgenden Testumgebung, die Liste wurde reduziert auf einen Knoten, wie pro die folgende Ausgabe:
Bekommen Sie keine bessere Zeit-Komplexität als Ihre Lösung, denn es ist O(n) und haben Sie zu besuchen, alle Knoten zu ändern, die Zeiger, aber Sie kann tun, eine Lösung mit nur zwei zusätzlichen Zeiger ganz leicht, wie im folgenden code gezeigt:
Dieser code gibt:
denen ich denke, dass ist das, was Sie nachher waren. Sie können tatsächlich tun dies, da sobald Sie geladen haben, bis
first
in die Zeiger Durchlaufen der Liste, die Sie wieder verwenden könnenfirst
.InformationsquelleAutor der Antwort paxdiablo
InformationsquelleAutor der Antwort splicer
Hier ist der code reverse eine einfach verknüpfte Liste in C.
Und hier ist es klebte unten:
InformationsquelleAutor der Antwort ma11hew28
Ja. Ich bin sicher, Sie können tun dies in der gleichen Weise Sie können tauschen Sie zwei zahlen ohne die Verwendung einer Dritten. Einfach werfen die Zeiger auf ein int/long und ausführen der XOR-operation ein paar mal. Dies ist eine von den C-tricks, das macht für eine lustige Frage, aber keinen praktischen Wert.
Können Sie reduzieren die O(n) Komplexität? Nein, nicht wirklich. Verwenden Sie einfach eine doppelt verkettete Liste, wenn Sie denken, Sie gehen zu müssen umgekehrter Reihenfolge.
InformationsquelleAutor der Antwort brianegge
Robert Sedgewick, "Algorithmen in C", Addison-Wesley, 3. Auflage, 1997, [Abschnitt 3.4]
Im Fall, dass nicht eine zyklische Liste ,daher NULL ist der Letzte link.
InformationsquelleAutor der Antwort limitcracker
Nur zum Spaß (obwohl tail-Rekursion Optimierung sollten aufhören, es zu Essen alle stack):
InformationsquelleAutor der Antwort Andrew Johnson
Vertauschen der beiden Variablen ohne den Einsatz einer temporären variable,
Schnellste Weg ist, es zu schreiben, in eine Zeile
Ähnlich,
Verwendung von zwei swaps
Lösung mit xor
Lösung in einer Zeile
Die gleiche Logik verwendet, um reverse-eine verlinkte Liste.
InformationsquelleAutor der Antwort Sibi Rajasekaran
Benötigen Sie eine track Zeiger die track-Liste.
Müssen Sie zwei Zeiger :
ersten Zeiger Holen ersten Knoten.
zweite Zeiger zu Holen zweiten Knoten.
Verarbeitung :
Verschieben Track Zeiger
Punkt zweiten Knoten zu dem ersten Knoten
Bewegen Erste Zeiger, der einen Schritt durch die Zuordnung zweiten Zeiger zu einem
Verschieben Zweite Zeiger um einen Schritt, Durch die Zuordnung von Track Zeiger auf zweite
}
InformationsquelleAutor der Antwort Sumit Arora
Wie über die mehr lesbar:
InformationsquelleAutor der Antwort Andrew Johnson
Hier ist eine einfachere version in Java. Es hat nur zwei Zeiger
curr
&prev
InformationsquelleAutor der Antwort ernesto
Ich verstehe nicht, warum es zurückgeben müssen Kopf, als wir übergeben es als argument. Wir passieren den Kopf des link-Liste, dann können wir auch update. Unten ist die einfache Lösung.
InformationsquelleAutor der Antwort Hardik Chauhan
InformationsquelleAutor der Antwort Shridhar Gadade
Arbeiten aus der Zeit-Komplexität des Algorithmus, die Sie verwenden jetzt und es sollte klar sein, dass es nicht verbessert werden kann.
InformationsquelleAutor der Antwort John La Rooy
Nein, nichts schneller als das aktuelle O(n) erledigt werden kann. Sie müssen sich verändern jeder Knoten, so wird die Zeit proportional zu der Anzahl der Elemente sowieso und das ist O(n), die Sie bereits haben.
InformationsquelleAutor der Antwort sharptooth
Mithilfe von zwei Zeigern, während die Aufrechterhaltung der Zeit-Komplexität von O(n), der am schnellsten erreichbar ist, kann nur möglich sein durch die Anzahl Typumwandlung von Zeigern und tauschen Ihre Werte. Hier ist eine Implementierung:
InformationsquelleAutor der Antwort Apshir
Ich habe einen etwas anderen Ansatz. Ich wollte mit den vorhandenen Funktionen (wie insert_at(index), delete_from(index)) zum umkehren der Liste (so etwas wie ein rechts-shift-operation). Die Komplexität ist immer noch O(n), aber der Vorteil ist mehr code wiederverwendet. Haben Sie einen Blick auf another_reverse () - Methode, und lassen Sie mich wissen, was Sie alle denken.
InformationsquelleAutor der Antwort FunBoy
InformationsquelleAutor der Antwort Amit Puri
InformationsquelleAutor der Antwort Mr. Amit Kumar
Ja, es ist ein Weg, mit nur zwei Zeigern. Das ist durch die Schaffung neuer Link-Liste, wo der erste Knoten ist der erste Knoten, der die Liste gegeben und der zweite Knoten der ersten Liste Hinzugefügt, um den start in die neue Liste und so weiter.
InformationsquelleAutor der Antwort deepak verma
Hier ist meine version:
wo
InformationsquelleAutor der Antwort cpp
Ich bin mit java zu implementieren und diese Herangehensweise ist test driven development daher Testfälle sind ebenfalls beigefügt.
Die Knoten-Klasse, stellen einzelne Knoten -
Service-Klasse, die dauert in der start-Knoten als Eingangs-und behalten, ohne zusätzlichen Platz.
Und Den test-Fall deckt, dass das oben beschriebene Szenario. Bitte beachten Sie, dass Sie benötigen, junit Gläser. Ich bin mit testng.jar; Sie können jede was dir gefällt..
InformationsquelleAutor der Antwort Mohammad Adnan
Einen einfachen Algorithmus, wenn Sie die verknüpfte Liste als stack-Struktur:
Kann die Leistung beeinträchtigt werden, da zusätzliche Funktion Aufruf der add und malloc, so dass die algorithmen der Adresse swaps sind besser, aber, dass man eigentlich erstellt neue Liste, so können Sie zusätzliche Optionen wie Sortieren oder entfernen von Elementen, wenn Sie fügen Sie eine callback-Funktion als parameter auf der Rückseite.
InformationsquelleAutor der Antwort Ilian Zapryanov
Hier ist ein bisschen anders, aber einfacher Ansatz in C++11:
Ausgabe hier
InformationsquelleAutor der Antwort Carl
Folgenden wird eine Implementierung mit 2 Zeigern (Brust und r)
InformationsquelleAutor der Antwort ARC
hier ist eine kleine einfache Lösung...
InformationsquelleAutor der Antwort waqar ahmed
Können Sie haben eine Lösung für dieses problem mit Hilfe von nur einem zusätzlichen Zeiger, dass zu statisch für die reverse-Funktion. Es ist in O(n) Komplexität.
InformationsquelleAutor der Antwort Shailendra Shrivastav
Als alternative, können Sie mit Rekursion-
InformationsquelleAutor der Antwort vaibhav
InformationsquelleAutor der Antwort Jostein Topland
Lösung mit 1 variable (Nur p):
InformationsquelleAutor der Antwort Vadakkumpadath