Zahlen, die bei Python sowieso schon beliebig lang sein können, sind IMHO ein schlechtes Beispiel. Verkettete Listen sind eine mögliche Implementierung eines Listen-ADTs. Eine Vielzahl von Algorithmen lassen sich darauf definieren.
Zunächst der ADT:
Code: Alles auswählen
head L -> E - liefert das erste Element der Liste
tail L -> L - liefert die Restliste ohne das erste Element
empty L -> bool - true, falls Liste leer, sonst false
cons E L -> L - Konstruiert eine Liste, indem E vorne angefügt wird
Jetzt die Implementierung mittels verketteter Listen, die Tupel benutzt, um das erste Element und die Restliste zu speichern. `None` steht für die leere Liste.
Code: Alles auswählen
def head(l): return l[0]
def tail(l): return l[1]
def cons(e, l): return e, l
def empty(l): return l is None
Eine derartige Liste kann man z.B. benutzen, um den Stack-ADT zu implementieren. Allgemein sind einfach verkettete Listen ein speichereffizientes Mittel, LIFO-Strukturen zu implementieren, da man sehr effizient (Aufwand O(1) vorne Anfügen und wieder entfernen kann. Mit einem Aufwand von O(n) kann man Element an anderer Stelle einfügen oder löschen. In einer doppelt verketteten Liste kann man zumindest mit O(1) ein beliebiges Element löschen. Meist merkt man sich dort auch noch das Ende der Liste, sodass man dort auch mit O(1) am Ende anfügen kann. In einer als Array implementierten Liste (so wie Python das AFAIK macht) ist zwar der Zugriff auf jedes Element O(1), doch das Einfügen oder Entfernen von Elementen prinzipiell immer O(n). Für den häufigen Fall des hinten Anfügen kann man's optimieren, ebenso könnte man den Fall des in der Mitte Einfügens (braucht man z.B. für Texteditoren) mittels einer speziellen Variante optimieren. Das geht aber beides zu Lasten des Speicherbedarfs.
Stefan