¿Cuál es la forma más fácil de usar una lista vinculada en Python? En el esquema, una lista vinculada se define simplemente por '(1 2 3 4 5)
. Las listas [1, 2, 3, 4, 5]
y las tuplas de Python (1, 2, 3, 4, 5)
no son, de hecho, listas enlazadas, y las listas enlazadas tienen algunas propiedades agradables, como la concatenación de tiempo constante y la capacidad de hacer referencia a partes separadas de ellas. ¡Hazlos inmutables y es realmente fácil trabajar con ellos!
python
linked-list
Claudiu
fuente
fuente
Respuestas:
Aquí hay algunas funciones de lista basadas en la representación de Martin v. Löwis :
dónde
w = sys.stdout.write
Aunque las listas doblemente vinculadas se usan de manera famosa en la receta del conjunto ordenado de Raymond Hettinger , las listas individualmente vinculadas no tienen ningún valor práctico en Python.
He nunca se utilizó una lista de enlace simple en Python para cualquier problema, excepto educativo.
Thomas Watnedal sugirió un buen recurso educativo Cómo pensar como un informático, Capítulo 17: Listas vinculadas :
Una lista vinculada es:
un nodo que contiene un objeto de carga y una referencia a una lista vinculada.
fuente
Para algunas necesidades, una deque también puede ser útil. Puede agregar y eliminar elementos en ambos extremos de una deque a un costo de O (1).
fuente
deque
es un tipo de datos útil, no es una lista vinculada (aunque se implementa utilizando una lista doblemente vinculada a nivel C). Entonces responde a la pregunta "¿qué usarías en lugar de listas enlazadas en Python?" y en ese caso la primera respuesta debería ser (para algunas necesidades) una lista de Python ordinaria (tampoco es una lista vinculada).linked_list[n]
) porque sería O (n). Las secuencias lo permiten y lo realizan en O (1). Sin embargo, las listas vinculadas, dado un iterador en la lista, pueden permitir la inserción y eliminación de O (1), mientras que las etiquetas no pueden (es O (n), como un vector). (Excepto en el frente y al final, donde ambas deques y listas vinculadas son O (1). (Aunque la deque probablemente se amortiza O (1). La lista vinculada no lo es))O(n)
) Si "casi en todos los sentidos" permite ignorar la diferencia en la O grande, entonces su declaración no tiene sentido porque podríamos usar una lista integrada de Python como una deque si no fuera por pop (0), inserte (0, v) las garantías de O grande .Escribí esto el otro día
fuente
list_print()
.La respuesta aceptada es bastante complicada. Aquí hay un diseño más estándar:
Es una
LinkedList
clase simple basada en el diseño directo de C ++ y el Capítulo 17: Listas vinculadas , según lo recomendado por Thomas Watnedal .fuente
X is None
es preferible==
. stackoverflow.com/a/2988117/1740227insert
no es un caso particular de la tercera, para que pueda eliminar por completo laelif
cláusula?Las listas inmutables se representan mejor a través de dos tuplas, ninguna representando NIL. Para permitir la formulación simple de tales listas, puede usar esta función:
Para trabajar con tales listas, prefiero proporcionar toda la colección de funciones LISP (es decir, primero, segundo, enésimo, etc.), que introducir métodos.
fuente
Aquí hay una versión un poco más compleja de una clase de lista vinculada, con una interfaz similar a los tipos de secuencia de Python (es decir, admite indexación, segmentación, concatenación con secuencias arbitrarias, etc.). Debe tener un antecedente O (1), no copia datos a menos que sea necesario y se puede usar de manera bastante intercambiable con las tuplas.
No será tan eficiente en tiempo o espacio como las celdas de contras lisp, ya que las clases de python son obviamente un poco más pesadas (podría mejorar un poco las cosas con "
__slots__ = '_head','_tail'
" para reducir el uso de memoria). Sin embargo, tendrá las características deseadas de rendimiento O grande.Ejemplo de uso:
Implementación:
fuente
llist: tipos de datos de listas vinculadas para Python
El módulo llist implementa estructuras de datos de listas vinculadas. Admite una lista doblemente vinculada, es decir,
dllist
y una estructura de datos individualmente vinculadasllist
.dllist objetos
Este objeto representa una estructura de datos de lista doblemente vinculada.
first
Primer
dllistnode
objeto en la lista.None
si la lista está vacíalast
Último
dllistnode
objeto en la lista. Ninguno si la lista está vacía.Los objetos dllist también admiten los siguientes métodos:
append(x)
Agregue
x
al lado derecho de la lista y regrese insertadodllistnode
.appendleft(x)
Agregue
x
al lado izquierdo de la lista y regrese insertadodllistnode
.appendright(x)
Agregue
x
al lado derecho de la lista y regrese insertadodllistnode
.clear()
Eliminar todos los nodos de la lista.
extend(iterable)
Agregue elementos desde
iterable
el lado derecho de la lista.extendleft(iterable)
Agregue elementos desde
iterable
el lado izquierdo de la lista.extendright(iterable)
Agregue elementos desde
iterable
el lado derecho de la lista.insert(x[, before])
Agregue
x
al lado derecho de la lista sibefore
no se especifica, o insertex
al lado izquierdo dedllistnode before
. Retorno insertadodllistnode
.nodeat(index)
Nodo de retorno (de tipo
dllistnode
) enindex
.pop()
Elimine y devuelva el valor de un elemento del lado derecho de la lista.
popleft()
Elimine y devuelva el valor de un elemento del lado izquierdo de la lista.
popright()
Eliminar y devolver el valor de un elemento del lado derecho de la lista
remove(node)
Eliminar
node
de la lista y devuelva el elemento que estaba almacenado en ella.dllistnode
objetosclase
llist.dllistnode([value])
Devuelve un nuevo nodo de lista doblemente vinculado, inicializado (opcionalmente) con
value
.dllistnode
los objetos proporcionan los siguientes atributos:next
Siguiente nodo en la lista. Este atributo es de solo lectura.
prev
Nodo anterior en la lista. Este atributo es de solo lectura.
value
Valor almacenado en este nodo. Compilado de esta referencia
sllist
clase
llist.sllist([iterable])
Devuelve una nueva lista vinculada individualmente inicializada con elementos deiterable
. Si no se especifica iterable, el nuevosllist
está vacío.Se define un conjunto similar de atributos y operaciones para este
sllist
objeto. Vea esta referencia para más información.fuente
fuente
Basé esta función adicional en Nick Stinemates
El método que tiene agrega el nuevo nodo al principio, mientras que he visto muchas implementaciones que generalmente agregan un nuevo nodo al final, pero lo que sea, es divertido hacerlo.
fuente
Lo siguiente es lo que se me ocurrió. Es similar a Riccardo C.'s , en este hilo, excepto que imprime los números en orden en lugar de hacerlo al revés. También hice que el objeto LinkedList sea un iterador de Python para imprimir la lista como lo haría con una lista normal de Python.
fuente
Acabo de hacer esto como un juguete divertido. Debería ser inmutable siempre y cuando no toques los métodos con un guión bajo y ponga en práctica un montón de magia de Python como indexación y
len
.fuente
Cuando use listas enlazadas inmutables, considere usar la tupla de Python directamente.
Es realmente así de fácil, y puedes mantener las funciones adicionales como len (ls), x en ls, etc.
fuente
fuente
Puse una clase de lista enlazada individualmente Python 2.xy 3.x en https://pypi.python.org/pypi/linked_list_mod/
Se ha probado con CPython 2.7, CPython 3.4, Pypy 2.3.1, Pypy3 2.3.1 y Jython 2.7b2, y viene con un buen conjunto de pruebas automatizadas.
También incluye clases LIFO y FIFO.
Sin embargo, no son inmutables.
fuente
fuente
Clase de lista vinculada
Uso
Salida
fuente
Aquí está mi implementación simple:
Salida:
fuente
Aquí está mi solución:
Implementación
Uso
Idea original de implementación
fuente
Creo que la implementación a continuación llena la factura con bastante gracia.
fuente
fuente
En primer lugar, supongo que quieres listas vinculadas. En la práctica, puede usar
collections.deque
, cuya implementación actual de CPython es una lista de bloques doblemente vinculados (cada bloque contiene una matriz de 62 objetos de carga). Subsume la funcionalidad de la lista vinculada. También puede buscar una extensión C llamadallist
en pypi. Si desea una implementación de Python pura y fácil de seguir de la lista vinculada ADT, puede echar un vistazo a mi siguiente implementación mínima.fuente
Muestra de una lista doblemente vinculada (guardar como Linkedlist.py):
Prueba (guardar como test.py):
Salida :
fuente
También escribí una Lista enlazada única basada en un tutorial, que tiene las dos clases básicas de Nodo y Lista enlazada, y algunos métodos adicionales para inserción, eliminación, inversión, clasificación y demás.
No es lo mejor ni lo más fácil, aunque funciona bien.
fuente
Ampliando la respuesta de Nick Stinemates
fuente
Mis 2 centavos
fuente
fuente
mi lista enlazada doble podría ser comprensible para los novatos. Si está familiarizado con DS en C, esto es bastante legible.
Aunque se pueden agregar muchas más simplificaciones a este código, pensé que una implementación en bruto sería más fácil de entender.
fuente
Si solo desea crear una lista simple de Me gusta, consulte este código
l = [1, [2, [3, [4, [5, [6, [7, [8, [9, [10]]]]]]]]]]
para visualizar la ejecución de este bacalao Visite http://www.pythontutor.com/visualize.html#mode=edit
fuente