Jaki jest najłatwiejszy sposób użycia połączonej listy w Pythonie? W schemacie połączoną listę definiuje się po prostu przez '(1 2 3 4 5)
. Listy Pythona [1, 2, 3, 4, 5]
i krotki (1, 2, 3, 4, 5)
nie są w rzeczywistości listami połączonymi, a listy połączone mają kilka miłych właściwości, takich jak konkatenacja w czasie stałym i możliwość odniesienia do ich oddzielnych części. Spraw, aby były niezmienne i są naprawdę łatwe w obsłudze!
python
linked-list
Claudiu
źródło
źródło
Odpowiedzi:
Oto kilka funkcji list opartych na reprezentacji Martina v. Löwisa :
gdzie
w = sys.stdout.write
Chociaż podwójnie połączone listy są powszechnie używane w przepisanym zestawie Raymonda Hettingera , pojedynczo połączone listy nie mają praktycznej wartości w Pythonie.
Nigdy nie korzystałem z pojedynczo połączonej listy w Pythonie dla żadnego problemu oprócz edukacyjnego.
Thomas Watnedal zasugerował dobry zasób edukacyjny Jak myśleć jak informatyk, rozdział 17: Listy powiązane :
Połączona lista to:
węzeł zawierający obiekt ładunku i odniesienie do połączonej listy.
źródło
W przypadku niektórych potrzeb przydatna może być również deque . Możesz dodawać i usuwać przedmioty na obu końcach deque po koszcie O (1).
źródło
deque
jest to przydatny typ danych, nie jest to lista połączona (chociaż jest implementowana przy użyciu podwójnie połączonej listy na poziomie C). Odpowiada więc na pytanie „czego byś użył zamiast połączonych list w Pythonie?” w takim przypadku pierwszą odpowiedzią powinna być (na niektóre potrzeby) zwykła lista w języku Python (nie jest to również lista połączona).linked_list[n]
), ponieważ byłoby to O (n). Dequeues na to pozwalają i wykonują to w O (1). Jednak połączone listy, podane iteratorowi na liście, mogą zezwalać na wstawianie i usuwanie O (1), podczas gdy deques nie może (to O (n), jak wektor). (Z wyjątkiem przodu i końca, gdzie zarówno deque, jak i powiązane listy są zarówno O (1). (Chociaż deque jest prawdopodobnie zamortyzowane O (1). Połączona lista nie jest.)O(n)
). Jeśli „prawie na wszystkie sposoby” pozwala zignorować różnicę w dużym O, to twoja instrukcja jest bez znaczenia, ponieważ moglibyśmy użyć wbudowanej listy Pythona jako deque, gdyby nie pop (0), wstaw (0, v) duże O gwarancje .Napisałem to kiedyś
źródło
list_print()
.Przyjęta odpowiedź jest dość skomplikowana. Oto bardziej standardowy projekt:
Jest to prosta
LinkedList
klasa oparta na prostym projekcie C ++ i rozdziale 17: Listy powiązane , zgodnie z zaleceniami Thomasa Watnedala .źródło
X is None
jest to lepsze niż==
. stackoverflow.com/a/2988117/1740227insert
nie jest przypadkiem szczególnym trzeciego, abyś mógł całkowicie usunąćelif
klauzulę?Niezmienne listy najlepiej reprezentować za pomocą dwóch krotek, przy czym Brak oznacza NIL. Aby umożliwić proste formułowanie takich list, możesz użyć tej funkcji:
Aby pracować z takimi listami, wolę udostępnić całą kolekcję funkcji LISP (tj. Pierwszą, drugą, n-tą itd.), Niż wprowadzać metody.
źródło
Oto nieco bardziej złożona wersja połączonej klasy listy, z interfejsem podobnym do typów sekwencji Pythona (tj. Obsługuje indeksowanie, dzielenie, konkatenację z dowolnymi sekwencjami itp.). Powinien mieć poprzedzający O (1), nie kopiuje danych, chyba że jest to konieczne i może być używany dość zamiennie z krotkami.
Nie będzie tak oszczędny pod względem miejsca ani czasu jak komórki przeciw lisp, ponieważ klasy Pythona mają oczywiście nieco większą wagę (możesz to nieco poprawić za pomocą „
__slots__ = '_head','_tail'
”, aby zmniejszyć zużycie pamięci). Będzie jednak miał pożądaną dużą charakterystykę wydajności O.Przykład użycia:
Realizacja:
źródło
llist - Powiązane typy danych list dla Pythona
Moduł llist implementuje połączone struktury danych list. Obsługuje podwójnie połączoną listę, tj.
dllist
Pojedynczo połączoną strukturę danychsllist
.obiekty dllist
Ten obiekt reprezentuje podwójnie połączoną strukturę danych listy.
first
Pierwszy
dllistnode
obiekt na liście.None
jeśli lista jest pusta.last
Ostatni, ubiegły, zeszły
dllistnode
obiekt na liście. Brak, jeśli lista jest pusta.Obiekty dllist obsługują również następujące metody:
append(x)
Dodaj
x
po prawej stronie listy i wróć wstawionydllistnode
.appendleft(x)
Dodaj
x
po lewej stronie listy i wróć wstawionydllistnode
.appendright(x)
Dodaj
x
po prawej stronie listy i wróć wstawionydllistnode
.clear()
Usuń wszystkie węzły z listy.
extend(iterable)
Dołącz elementy z
iterable
prawej strony listy.extendleft(iterable)
Dołącz elementy z
iterable
lewej strony listy.extendright(iterable)
Dołącz elementy z
iterable
prawej strony listy.insert(x[, before])
Dodaj
x
po prawej stronie listy, jeślibefore
nie jest określony, lub wstawx
po lewej stroniedllistnode before
. Zwrot włożonydllistnode
.nodeat(index)
Zwróć węzeł (typu
dllistnode
) oindex
.pop()
Usuń i zwróć wartość elementu z prawej strony listy.
popleft()
Usuń i zwróć wartość elementu z lewej strony listy.
popright()
Usuń i zwróć wartość elementu z prawej strony listy
remove(node)
Usuń
node
z listy i zwróć element, który był w niej zapisany.dllistnode
przedmiotyklasa
llist.dllistnode([value])
Zwraca nowy podwójnie połączony węzeł listy, zainicjowany (opcjonalnie) za pomocą
value
.dllistnode
obiekty zapewniają następujące atrybuty:next
Następny węzeł na liście. Ten atrybut jest tylko do odczytu.
prev
Poprzedni węzeł na liście. Ten atrybut jest tylko do odczytu.
value
Wartość przechowywana w tym węźle. Opracowano na podstawie tego odniesienia
lista odtwarzania
klasa
llist.sllist([iterable])
Zwraca nową pojedynczo połączoną listę zainicjowaną elementami ziterable
. Jeśli iterable nie jest określony, nowysllist
jest pusty.Podobny zestaw atrybutów i operacji jest zdefiniowany dla tego
sllist
obiektu. Zobacz to odniesienie, aby uzyskać więcej informacji.źródło
źródło
Oparłem tę dodatkową funkcję na Nicku Stinemacie
Metoda, którą dodał, dodaje nowy węzeł na początku, podczas gdy widziałem wiele implementacji, które zwykle dodają nowy węzeł na końcu, ale cokolwiek, fajnie jest to zrobić.
źródło
Oto co wymyśliłem. Jest prostszy do Riccardo C. , w tym wątku, z tym wyjątkiem, że drukuje liczby w kolejności zamiast w odwrotnej kolejności. Ustawiłem również obiekt LinkedList jako Iterator w języku Python, aby wydrukować listę tak, jak normalną listę w języku Python.
źródło
Zrobiłem to jako zabawną zabawkę. Powinien być niezmienny, o ile nie dotkniesz metod z prefiksem podkreślenia i implementuje wiele magii Python, takich jak indeksowanie i
len
.źródło
Korzystając z niezmiennych list połączonych, rozważ bezpośrednie użycie krotki Pythona.
To naprawdę taka łatwość i możesz zachować dodatkowe funkcje, takie jak len (ls), x in ls itp.
źródło
źródło
Umieściłem pojedynczo połączoną klasę list Python 2.x i 3.x na https://pypi.python.org/pypi/linked_list_mod/
Jest testowany z CPython 2.7, CPython 3.4, Pypy 2.3.1, Pypy3 2.3.1 i Jython 2.7b2, i jest wyposażony w ładny automatyczny zestaw testów.
Obejmuje także klasy LIFO i FIFO.
Nie są jednak niezmienne.
źródło
źródło
Klasa listy połączonej
Stosowanie
Wynik
źródło
Oto moja prosta implementacja:
Wynik:
źródło
Oto moje rozwiązanie:
Realizacja
Stosowanie
Oryginalny pomysł wdrożenia
źródło
Myślę, że poniższe wdrożenie wypełnia rachunek dość wdzięcznie.
źródło
źródło
Po pierwsze, zakładam, że chcesz listy połączone. W praktyce możesz użyć
collections.deque
, którego obecna implementacja CPython jest podwójnie połączoną listą bloków (każdy blok zawiera tablicę 62 obiektów ładunkowych). Podejmuje funkcjonalność połączonej listy. Możesz także wyszukać rozszerzenie C o nazwiellist
pypi. Jeśli chcesz implementacji czysto Pythona i łatwej do śledzenia implementacji dołączonej listy ADT, możesz rzucić okiem na moją następującą minimalną implementację.źródło
Próbka podwójnie połączonej listy (zapisz jako linkedlist.py):
Testowanie (zapisz jako test.py):
Wyjście :
źródło
Napisałem również Pojedynczą listę połączoną na podstawie niektórych samouczków, która zawiera podstawowe dwie klasy Węzłów i Listy połączonej oraz kilka dodatkowych metod wstawiania, usuwania, odwracania, sortowania i tym podobne.
To nie jest najlepsze ani najłatwiejsze, choć działa OK.
źródło
Rozszerzanie Nick Stinemates za odpowiedź
źródło
Moje 2 centy
źródło
źródło
moja podwójna lista może być zrozumiała dla noobies. Jeśli znasz DS w C, jest to dość czytelne.
Chociaż do tego kodu można dodać wiele innych uproszczeń, pomyślałem, że surowa implementacja sprawi, że będę bardziej do przyjęcia.
źródło
Jeśli chcesz po prostu utworzyć prostą listę polubionych, skorzystaj z tego kodu
l = [1, [2, [3, [4, [5, [6, [7, [8, [9] [10]]]]]]]]]]]
do wizualizacji wykonania dla tego dorsza Odwiedź http://www.pythontutor.com/visualize.html#mode=edit
źródło