Was ist der einfachste Weg, eine verknüpfte Liste in Python zu verwenden? Im Schema wird eine verknüpfte Liste einfach durch definiert '(1 2 3 4 5)
. Pythons Listen [1, 2, 3, 4, 5]
und Tupel (1, 2, 3, 4, 5)
sind in der Tat keine verknüpften Listen, und verknüpfte Listen haben einige nette Eigenschaften wie die zeitlich konstante Verkettung und die Möglichkeit, auf separate Teile davon zu verweisen. Machen Sie sie unveränderlich und es ist wirklich einfach, mit ihnen zu arbeiten!
python
linked-list
Claudiu
quelle
quelle
Antworten:
Hier sind einige Listenfunktionen, die auf der Darstellung von Martin v. Löwis basieren :
wo
w = sys.stdout.write
Obwohl doppelt verknüpfte Listen in Raymond Hettingers geordnetem Set-Rezept bekanntermaßen verwendet werden , haben einfach verknüpfte Listen in Python keinen praktischen Wert.
Ich habe in Python noch nie eine einzeln verknüpfte Liste für andere Probleme als für Bildungszwecke verwendet.
Thomas Watnedal schlug eine gute Bildungsressource vor. Wie man wie ein Informatiker denkt, Kapitel 17: Verknüpfte Listen :
Eine verknüpfte Liste ist entweder:
Ein Knoten, der ein Frachtobjekt und einen Verweis auf eine verknüpfte Liste enthält.
quelle
Für einige Bedürfnisse kann auch eine Deque nützlich sein. Sie können Gegenstände an beiden Enden einer Deque zu O (1) -Kosten hinzufügen und entfernen.
quelle
deque
es sich um einen nützlichen Datentyp handelt, handelt es sich nicht um eine verknüpfte Liste (obwohl sie mithilfe einer doppelt verknüpften Liste auf C-Ebene implementiert wird). Es beantwortet also die Frage "Was würden Sie anstelle von verknüpften Listen in Python verwenden?" und in diesem Fall sollte die erste Antwort (für einige Anforderungen) eine gewöhnliche Python-Liste sein (es ist auch keine verknüpfte Liste).linked_list[n]
), da dies O (n) wäre. Dequeues erlauben es und führen es in O (1) aus. Verknüpfte Listen können jedoch, wenn ein Iterator in die Liste aufgenommen wird, das Einfügen und Entfernen von O (1) ermöglichen, während Deques dies nicht können (es ist O (n), wie ein Vektor). (Außer an der Vorderseite und am Ende, wo sowohl Deques als auch verknüpfte Listen O (1) sind. (Obwohl die Deque wahrscheinlich amortisiert wird. O (1). Die verknüpfte Liste ist nicht.)O(n)
). Wenn "fast in jeder Hinsicht" es erlaubt, den Unterschied in Big O zu ignorieren, ist Ihre Aussage bedeutungslos, da wir eine in Python integrierte Liste als Deque verwenden könnten, wenn Pop (0) nicht vorhanden wäre. Fügen Sie (0, v) Big O-Garantien ein .Ich habe das neulich geschrieben
quelle
list_print()
.Die akzeptierte Antwort ist ziemlich kompliziert. Hier ist ein Standarddesign:
Es ist eine einfache
LinkedList
Klasse, die auf dem einfachen C ++ - Design und Kapitel 17: Verknüpfte Listen basiert , wie von Thomas Watnedal empfohlen .quelle
X is None
ist dem vorzuziehen==
. stackoverflow.com/a/2988117/1740227insert
kein besonderer Fall des dritten, so dass Sie dieelif
Klausel vollständig entfernen können ?Unveränderliche Listen werden am besten durch zwei Tupel dargestellt, wobei None NIL darstellt. Um eine einfache Formulierung solcher Listen zu ermöglichen, können Sie diese Funktion verwenden:
Um mit solchen Listen zu arbeiten, würde ich lieber die gesamte Sammlung von LISP-Funktionen (dh erste, zweite, n-te usw.) bereitstellen, als Methoden einzuführen.
quelle
Hier ist eine etwas komplexere Version einer verknüpften Listenklasse mit einer ähnlichen Schnittstelle zu den Sequenztypen von Python (dh unterstützt Indizierung, Slicing, Verkettung mit beliebigen Sequenzen usw.). Es sollte O (1) voranstellen, kopiert keine Daten, es sei denn, es muss und kann ziemlich austauschbar mit Tupeln verwendet werden.
Es ist nicht so platz- oder zeiteffizient wie Lisp-Cons-Zellen, da Python-Klassen offensichtlich etwas schwerer sind (Sie könnten die Dinge mit "
__slots__ = '_head','_tail'
" leicht verbessern , um die Speichernutzung zu reduzieren). Es wird jedoch die gewünschten großen O-Leistungsmerkmale aufweisen.Anwendungsbeispiel:
Implementierung:
quelle
llist - Datentypen für verknüpfte Listen für Python
Das Listenmodul implementiert verknüpfte Listendatenstrukturen. Es unterstützt eine doppelt verknüpfte Liste, dh
dllist
eine einfach verknüpfte Datenstruktursllist
.DLLIST-Objekte
Dieses Objekt repräsentiert eine doppelt verknüpfte Listendatenstruktur.
first
Erstes
dllistnode
Objekt in der Liste.None
wenn die Liste leer ist.last
Letztes
dllistnode
Objekt in der Liste. Keine, wenn die Liste leer ist.DLLIST-Objekte unterstützen auch die folgenden Methoden:
append(x)
In
x
auf der rechten Seite der Liste und Rückkehr eingefügtdllistnode
.appendleft(x)
In
x
auf der linken Seite der Liste und Rückkehr eingefügtdllistnode
.appendright(x)
In
x
auf der rechten Seite der Liste und Rückkehr eingefügtdllistnode
.clear()
Entfernen Sie alle Knoten aus der Liste.
extend(iterable)
Fügen Sie Elemente von
iterable
der rechten Seite der Liste hinzu.extendleft(iterable)
Fügen Sie Elemente von
iterable
der linken Seite der Liste hinzu.extendright(iterable)
Fügen Sie Elemente von
iterable
der rechten Seite der Liste hinzu.insert(x[, before])
Fügen Sie
x
zur rechten Seite der Liste hinzu, wennbefore
nichts angegeben ist, oder fügen Siex
sie zur linken Seite von eindllistnode before
. Rückgabe eingefügtdllistnode
.nodeat(index)
Rückgabeknoten (vom Typ
dllistnode
) umindex
.pop()
Entfernen Sie den Wert eines Elements und geben Sie ihn von der rechten Seite der Liste zurück.
popleft()
Entfernen Sie den Wert eines Elements und geben Sie ihn von der linken Seite der Liste zurück.
popright()
Entfernen Sie den Wert eines Elements und geben Sie ihn von der rechten Seite der Liste zurück
remove(node)
Entfernen
node
Aus der Liste und das darin gespeicherte Element zurückgeben.dllistnode
ObjekteKlasse
llist.dllistnode([value])
Gibt einen neuen doppelt verknüpften Listenknoten zurück, der (optional) mit initialisiert wurde
value
.dllistnode
Objekte bieten die folgenden Attribute:next
Nächster Knoten in der Liste. Dieses Attribut ist schreibgeschützt.
prev
Vorheriger Knoten in der Liste. Dieses Attribut ist schreibgeschützt.
value
In diesem Knoten gespeicherter Wert. Aus dieser Referenz zusammengestellt
Liste
Klasse
llist.sllist([iterable])
Gibt eine neue einfach verknüpfte Liste zurück, die mit Elementen von initialisiert wurdeiterable
. Wenn iterable nicht angegeben ist, wird das neuesllist
leer.Ein ähnlicher Satz von Attributen und Operationen ist für dieses
sllist
Objekt definiert . Weitere Informationen finden Sie in dieser Referenz.quelle
quelle
Ich habe diese zusätzliche Funktion auf Nick Stinemates basiert
Die Methode, die er hat, fügt den neuen Knoten am Anfang hinzu, während ich viele Implementierungen gesehen habe, die normalerweise am Ende einen neuen Knoten hinzufügen, aber was auch immer, es macht Spaß, dies zu tun.
quelle
Folgendes habe ich mir ausgedacht. Es ähnelt Riccardo C. in diesem Thread, außer dass die Zahlen in der Reihenfolge und nicht umgekehrt gedruckt werden. Ich habe das LinkedList-Objekt auch zu einem Python-Iterator gemacht, um die Liste wie eine normale Python-Liste auszudrucken.
quelle
Ich habe gerade das als Spaß Spielzeug. Es sollte unveränderlich sein, solange Sie die Methoden mit dem Unterstrich nicht berühren, und es implementiert eine Reihe von Python-Magie wie Indizierung und
len
.quelle
Wenn Sie unveränderliche verknüpfte Listen verwenden, sollten Sie das Python-Tupel direkt verwenden.
Es ist wirklich so einfach, und Sie können die zusätzlichen Funktionen wie len (ls), x in ls usw. beibehalten.
quelle
quelle
Ich habe eine einfach verknüpfte Listenklasse für Python 2.x und 3.x unter https://pypi.python.org/pypi/linked_list_mod/ eingestellt.
Es wurde mit CPython 2.7, CPython 3.4, Pypy 2.3.1, Pypy3 2.3.1 und Jython 2.7b2 getestet und verfügt über eine schöne automatisierte Testsuite.
Es enthält auch LIFO- und FIFO-Klassen.
Sie sind jedoch nicht unveränderlich.
quelle
quelle
Verknüpfte Listenklasse
Verwendung
Ausgabe
quelle
Hier ist meine einfache Implementierung:
Ausgabe:
quelle
Hier ist meine Lösung:
Implementierung
Verwendung
Ursprüngliche Implementierungsidee
quelle
Ich denke, die unten stehende Implementierung füllt die Rechnung recht elegant aus.
quelle
quelle
Zunächst gehe ich davon aus, dass Sie verknüpfte Listen möchten. In der Praxis können Sie verwenden
collections.deque
, deren aktuelle CPython-Implementierung eine doppelt verknüpfte Liste von Blöcken ist (jeder Block enthält ein Array von 62 Frachtobjekten). Es fasst die Funktionalität der verknüpften Liste zusammen. Sie können auch nach einer C-Erweiterung suchen, diellist
auf pypi aufgerufen wird. Wenn Sie eine reine Python- und einfach zu verfolgende Implementierung der verknüpften Liste ADT wünschen, können Sie sich meine folgende minimale Implementierung ansehen.quelle
Beispiel einer doppelt verknüpften Liste (speichern unter linkedlist.py):
Testen (als test.py speichern):
Ausgabe :
quelle
Ich habe auch eine einzelne verknüpfte Liste geschrieben, die auf einem Tutorial basiert, das die beiden grundlegenden Klassen "Knoten" und "verknüpfte Liste" sowie einige zusätzliche Methoden zum Einfügen, Löschen, Umkehren, Sortieren usw. enthält.
Es ist nicht das Beste oder Einfachste, funktioniert aber in Ordnung.
quelle
Die Erweiterung Nick Stinemates die Antwort
quelle
Meine 2 Cent
quelle
quelle
Meine doppelt verknüpfte Liste ist für Noobies möglicherweise verständlich. Wenn Sie mit DS in C vertraut sind, ist dies gut lesbar.
Obwohl diesem Code noch viele weitere Vereinfachungen hinzugefügt werden können, dachte ich, eine rohe Implementierung würde mich greifbarer machen.
quelle
Wenn Sie nur eine einfache Likörliste erstellen möchten, verweisen Sie auf diesen Code
l = [1, [2, [3, [4, [5, [6, [7, [8, [9, [10]]]]]]]]]]
Informationen zur Visualisierung der Ausführung dieses Kabeljaus finden Sie unter http://www.pythontutor.com/visualize.html#mode=edit
quelle