Lista enlazada en Python
- ¿Qué es una lista enlazada en Python?
- Cómo crear una lista enlazada en Python
- Imprimir todos los elementos de una lista enlazada en Python
- Insertar un elemento en una lista vinculada en Python
- Eliminar un elemento de la lista vinculada en Python
- Cuente la cantidad de elementos en una lista vinculada en Python
- Actualizar un nodo en la lista vinculada en Python
- Por qué usar una lista enlazada en Python
- Lista enlazada de implementación completa en Python
- Conclusión
Python nos proporciona varias estructuras de datos integradas.
Sin embargo, cada estructura de datos tiene sus restricciones. Debido a esto, necesitamos estructuras de datos personalizadas.
Este artículo discutirá una estructura de datos personalizada llamada Lista enlazada. También implementaremos una lista vinculada en Python y realizaremos varias operaciones en la lista vinculada.
¿Qué es una lista enlazada en Python?
Como sugiere el nombre, una lista enlazada es una estructura de datos que contiene elementos conectados mediante un enlace.
Una lista enlazada se crea usando objetos llamados nodos. Cada nodo contiene dos atributos: uno para almacenar los datos y el otro para conectarse al siguiente nodo en la lista vinculada.
Puede comprender la estructura de un nodo utilizando la siguiente figura.
Aquí,
- Un
Node
es un objeto que contiene los atributosdata
ynext
. - El atributo
data
almacena los datos. - El atributo
next
se refiere al siguiente nodo en la lista enlazada.
Como se muestra en la siguiente imagen, podemos conectar varios nodos para crear una lista enlazada.
Aquí,
- Hemos creado una lista enlazada que consta de cuatro nodos.
- El primer nodo contiene el número 10, el segundo nodo contiene 20, el tercer nodo contiene 30 y el último nodo contiene 40.
- También hemos creado una variable
Head
que hace referencia al primer nodo. Solo mantenemos la variableHead
en un objeto de lista enlazada. Los datos de todos los demás nodos se obtienen recorriendo la lista enlazada a partir del primer nodo al que hace referenciaHead
. - El atributo
next
del último nodo hace referencia a un objetoNone
. El atributonext
del último nodo de una lista enlazada siempre se referirá al objetoNone
. - Si una lista enlazada está vacía, la variable
Head
se referirá al objetoNone
.
Ahora entendemos la estructura básica de una lista enlazada. Implementemos una lista enlazada en Python.
Cómo crear una lista enlazada en Python
Como los nodos son los componentes básicos de una lista enlazada, primero crearemos un nodo. Para ello, definiremos una clase Node
con los atributos data
y next
como se muestra a continuación.
class Node:
def __init__(self, data):
self.data = data
self.next = None
myNode = Node(10)
print("The data in the node is:", myNode.data)
print("The next attribute in the node is:", myNode.next)
Producción :
The data in the node is: 10
The next attribute in the node is: None
En el ejemplo anterior, puede observar que el atributo next
del Node
se refiere a None
por defecto. Cuando lo insertamos en una lista enlazada, asignamos el atributo next
a los nodos de la lista enlazada, como veremos más adelante.
Debemos crear un objeto con el atributo Head
para crear una lista enlazada. Podemos definir la clase LinkedList
como se muestra a continuación.
class Node:
def __init__(self, data):
self.data = data
self.next = None
class LinkedList:
def __init__(self):
self.Head = None
myLinkedList = LinkedList()
myNode1 = Node(10)
myNode2 = Node(20)
myNode3 = Node(30)
myNode4 = Node(40)
myLinkedList.Head = myNode1
myNode1.next = myNode2
myNode2.next = myNode3
myNode3.next = myNode4
print("The elements in the linked list are:")
print(myLinkedList.Head.data, end=" ")
print(myLinkedList.Head.next.data, end=" ")
print(myLinkedList.Head.next.next.data, end=" ")
print(myLinkedList.Head.next.next.next.data)
Producción :
The linked list is:
10 20 30 40
En el ejemplo anterior, creamos una lista enlazada.
Después de eso, creamos manualmente los nodos utilizando los datos proporcionados, los agregamos a la lista vinculada uno por uno y los imprimimos. Más tarde, aprenderemos a insertar elementos en una lista enlazada utilizando el bucle while
de Python.
Analicemos ahora cómo podemos imprimir todos los elementos de una lista enlazada sin acceder manualmente a todos los nodos.
Imprimir todos los elementos de una lista enlazada en Python
Usaremos un bucle while
para imprimir todos los elementos de la lista enlazada.
Comenzando desde el puntero Head
, primero imprimiremos los datos en el nodo actual usando el atributo data
del nodo. Después de eso, nos moveremos al siguiente nodo usando el puntero next
.
Seguiremos este proceso hasta llegar al final de la lista enlazada (es decir, el atributo next
de un nodo resulta ser None
). Como se muestra a continuación, puede implementar toda la lógica en el método printList()
.
class Node:
def __init__(self, data):
self.data = data
self.next = None
class LinkedList:
def __init__(self):
self.Head = None
def printList(self):
current = self.Head
while current is not None:
print(current.data, end=" ")
current = current.next
myLinkedList = LinkedList()
myNode1 = Node(10)
myNode2 = Node(20)
myNode3 = Node(30)
myNode4 = Node(40)
myLinkedList.Head = myNode1
myNode1.next = myNode2
myNode2.next = myNode3
myNode3.next = myNode4
print("The elements in the linked list are:")
myLinkedList.printList()
Producción :
The elements in the linked list are:
10 20 30 40
Insertar un elemento en una lista vinculada en Python
Hay cuatro situaciones al insertar un elemento en una lista enlazada.
- La lista enlazada puede estar vacía antes de la inserción.
- Tenemos que insertar un elemento al principio de una lista enlazada no vacía.
- Tenemos que insertar un elemento al final de una lista enlazada.
- Tenemos que insertar un elemento en una posición dada en la lista enlazada.
Discutamos cómo insertar un elemento en la lista enlazada en todas las situaciones.
Insertar un elemento en una lista vinculada vacía
Para insertar un elemento en una lista enlazada vacía, definiremos un método insertIntoEmptyList()
que acepta el elemento como argumento de entrada y agrega un nodo que contiene el elemento de entrada en la lista enlazada.
Para ello crearemos un nodo en el insertIntoEmptyList()
con el elemento input como data
. Después de crear el nodo, asignaremos el nodo al atributo Head
.
De esta forma, el nuevo nodo se convertirá en el primer nodo de la lista enlazada. El método se puede implementar de la siguiente manera.
class Node:
def __init__(self, data):
self.data = data
self.next = None
class LinkedList:
def __init__(self):
self.Head = None
def printList(self):
current = self.Head
while current is not None:
print(current.data, end=" ")
current = current.next
def insertIntoEmptyList(self, element):
newNode = Node(element)
self.Head = newNode
myLinkedList = LinkedList()
myLinkedList.insertIntoEmptyList(10)
print("The elements in the linked list are:")
myLinkedList.printList()
Producción :
The elements in the linked list are:
10
Insertar un elemento al principio de una lista vinculada
Para insertar un elemento al comienzo de una lista no vacía, definiremos un método insertAtBeginning()
que toma un elemento como entrada y lo agrega al comienzo de la lista enlazada. En el método insertAtBeginning()
, primero crearemos un nodo con el elemento de entrada como datos.
Después de eso, apuntaremos el atributo next
del nodo recién creado al nodo donde apunta el atributo Head
de la lista enlazada. A continuación, asignaremos el nodo recién creado al atributo Head
.
De esta forma, el nuevo nodo se insertará al principio de la lista enlazada.
class Node:
def __init__(self, data):
self.data = data
self.next = None
class LinkedList:
def __init__(self):
self.Head = None
def printList(self):
current = self.Head
while current is not None:
print(current.data, end=" ")
current = current.next
def insertIntoEmptyList(self, element):
newNode = Node(element)
self.Head = newNode
def insertAtBeginning(self, element):
newNode = Node(element)
newNode.next = self.Head
self.Head = newNode
myLinkedList = LinkedList()
myLinkedList.insertIntoEmptyList(10)
myLinkedList.insertAtBeginning(20)
myLinkedList.insertAtBeginning(30)
print("The elements in the linked list are:")
myLinkedList.printList()
Producción :
The elements in the linked list are:
30 20 10
Como se muestra a continuación, podemos combinar los métodos anteriores para crear un solo método para insertar un elemento al comienzo de una lista vinculada.
class Node:
def __init__(self, data):
self.data = data
self.next = None
class LinkedList:
def __init__(self):
self.Head = None
def printList(self):
current = self.Head
while current is not None:
print(current.data, end=" ")
current = current.next
def insertAtBeginning(self, element):
if self.Head is None:
newNode = Node(element)
self.Head = newNode
else:
newNode = Node(element)
newNode.next = self.Head
self.Head = newNode
myLinkedList = LinkedList()
myLinkedList.insertAtBeginning(10)
myLinkedList.insertAtBeginning(20)
myLinkedList.insertAtBeginning(30)
print("The elements in the linked list are:")
myLinkedList.printList()
Producción :
The elements in the linked list are:
30 20 10
Hemos fusionado el método insertIntoEmptyList()
en el método insertAtBeginning()
porque insertar en una lista enlazada vacía esencialmente significa que estamos insertando un elemento al principio de la lista enlazada.
Insertar un elemento al final de una lista vinculada
Insertar un elemento al final de una lista vacía es similar a insertar el elemento al principio de la lista enlazada.
Para insertar un elemento al final de una lista enlazada, primero comprobaremos si la lista enlazada está vacía. Si se encuentra que la lista enlazada está vacía, simplemente podemos asignar un nodo que contenga el nuevo elemento al atributo Head
como hicimos en el método insertAtBeginning()
.
De lo contrario, recorreremos la lista enlazada hasta el final usando un bucle while
. Comenzaremos con la Head
y continuaremos moviéndonos al siguiente nodo usando el atributo next
de los nodos hasta que encontremos que el atributo next
del nodo apunta a None
.
Una vez que llegamos a un nodo cuyo atributo next
apunta a None
, estamos en el último nodo. Ahora, crearemos un nuevo nodo usando los datos de entrada y asignaremos este nodo al siguiente atributo del último nodo de la lista enlazada.
De esta forma, el nuevo elemento se insertará al final de la lista enlazada. Puede implementar toda esta lógica en el método insertAtEnd()
de la siguiente manera.
class Node:
def __init__(self, data):
self.data = data
self.next = None
class LinkedList:
def __init__(self):
self.Head = None
def printList(self):
current = self.Head
while current is not None:
print(current.data, end=" ")
current = current.next
def insertAtEnd(self, element):
if self.Head is None:
newNode = Node(element)
self.Head = newNode
else:
current = self.Head
while current.next is not None:
current = current.next
newNode = Node(element)
current.next = newNode
myLinkedList = LinkedList()
myLinkedList.insertAtEnd(10)
myLinkedList.insertAtEnd(20)
myLinkedList.insertAtEnd(30)
print("The elements in the linked list are:")
myLinkedList.printList()
Producción :
The elements in the linked list are:
10 20 30
Insertar un Elemento en una Posición Dada en la Lista Vinculada
Usaremos una variable de contador y un bucle while
para insertar un elemento en una posición dada en la lista enlazada.
Comenzaremos desde el puntero Head y continuaremos moviéndonos al siguiente nodo usando el bucle while
. En cada iteración, también incrementaremos la variable contador.
Una vez que alcanzamos el nodo antes de la posición dada, salimos del bucle while
. Además, saldremos del bucle si llegamos al final de la lista enlazada. De lo contrario, el programa se ejecutará en un error.
Después de eso, si todavía estamos en el Head
, tenemos que agregar el elemento en la primera posición de la lista enlazada; asignaremos el nodo en la posición dada al puntero next
que contiene el nuevo elemento de nodo. A continuación, asignaremos el nodo del nuevo elemento al Head
de la lista enlazada.
Si no tenemos que insertar el elemento en la primera posición, asignaremos el nodo en la posición dada al puntero next
del nodo que contiene el nuevo elemento. A continuación, asignaremos el nuevo nodo al atributo next
del nodo en position-1
.
De esta forma, el nuevo elemento se insertará en la posición dada. Como se muestra a continuación, puede implementar toda la lógica en el método insertAtPosition()
.
class Node:
def __init__(self, data):
self.data = data
self.next = None
class LinkedList:
def __init__(self):
self.Head = None
def printList(self):
current = self.Head
while current is not None:
print(current.data, end=" ")
current = current.next
print("")
def insertAtPosition(self, element, position):
counter = 1
current = self.Head
while counter < position - 1 and current is not None:
counter += 1
current = current.next
if position == 1:
newNode = Node(element)
newNode.next = current
self.Head = newNode
else:
newNode = Node(element)
newNode.next = current.next
current.next = newNode
myLinkedList = LinkedList()
myLinkedList.insertAtPosition(10, 1)
print("The elements in the linked list are:")
myLinkedList.printList()
myLinkedList.insertAtPosition(20, 2)
print("The elements in the linked list are:")
myLinkedList.printList()
myLinkedList.insertAtPosition(30, 3)
print("The elements in the linked list are:")
myLinkedList.printList()
myLinkedList.insertAtPosition(40, 2)
print("The elements in the linked list are:")
myLinkedList.printList()
Producción :
The elements in the linked list are:
10
The elements in the linked list are:
10 20
The elements in the linked list are:
10 20 30
The elements in the linked list are:
10 40 20 30
Eliminar un elemento de la lista vinculada en Python
Puede haber tres situaciones cuando intentamos eliminar un elemento de una lista enlazada.
- Tenemos que eliminar el primer elemento de la lista enlazada.
- Tenemos que eliminar el último elemento de la lista enlazada.
- Tenemos que eliminar el elemento en cualquier posición de la lista Vinculada.
Discutamos todos estos casos uno por uno.
Eliminar el primer elemento de una lista vinculada
Para eliminar el primer elemento de una lista enlazada, primero comprobaremos si la lista enlazada está vacía o no.
Para ello comprobaremos si el Head
de la lista enlazada apunta a None
. En caso afirmativo, informaremos al usuario que la lista vinculada está vacía y no tenemos ningún elemento para eliminar.
De lo contrario, asignaremos el primer nodo a una variable temporal. Después de eso, asignaremos el segundo nodo de la lista enlazada al atributo Head
.
Luego, eliminaremos el primer nodo almacenado en la variable temporal usando la instrucción del
. Como se muestra a continuación, puede implementar toda la lógica en el método deleteFromBeginning()
.
class Node:
def __init__(self, data):
self.data = data
self.next = None
class LinkedList:
def __init__(self):
self.Head = None
def printList(self):
current = self.Head
while current is not None:
print(current.data, end=" ")
current = current.next
print("")
def insertAtPosition(self, element, position):
counter = 1
current = self.Head
while counter < position - 1 and current is not None:
counter += 1
current = current.next
if position == 1:
newNode = Node(element)
newNode.next = current
self.Head = newNode
else:
newNode = Node(element)
newNode.next = current.next
current.next = newNode
def deleteFromBeginning(self):
if self.Head is None:
print("The linked list empty. Cannot delete an element.")
return
else:
node = self.Head
self.Head = self.Head.next
del node
myLinkedList = LinkedList()
myLinkedList.insertAtPosition(10, 1)
myLinkedList.insertAtPosition(20, 2)
myLinkedList.insertAtPosition(30, 3)
myLinkedList.insertAtPosition(40, 2)
print("The elements in the linked list are:")
myLinkedList.printList()
myLinkedList.deleteFromBeginning()
print("The elements in the linked list are:")
myLinkedList.printList()
myLinkedList.deleteFromBeginning()
print("The elements in the linked list are:")
myLinkedList.printList()
Producción :
The elements in the linked list are:
10 40 20 30
The elements in the linked list are:
40 20 30
The elements in the linked list are:
20 30
Eliminar el último elemento de una lista vinculada
Para eliminar el último elemento de una lista enlazada, primero comprobaremos si la lista enlazada está vacía o no.
Para ello comprobaremos si el Head
de la lista enlazada apunta a None
. En caso afirmativo, informaremos al usuario que la lista vinculada está vacía y no tenemos ningún elemento para eliminar.
Si hay elementos presentes en la lista, seguiremos el siguiente proceso.
- Asignar el primer nodo a una variable
current
. - Inicializar una variable
previous
aNone
. - Atraviese la lista enlazada utilizando un bucle
while
, asigne el nodo en la variablecurrent
a la variableprevious
y avance la variablecurrent
al siguiente nodo hasta que la variablecurrent
llegue al último nodo . En este caso, el atributonext
del nodo asignado acurrent
pasa a serNone
. - Una vez que la variable actual llegue al último nodo, asignaremos
None
al atributonext
de la variableprevious
y eliminaremos el nodo asignado a la variablecurrent
.
Podemos eliminar el último elemento de una lista enlazada ejecutando los pasos anteriores. Como se muestra a continuación, puede implementar toda la lógica en el método deleteFromLast()
.
class Node:
def __init__(self, data):
self.data = data
self.next = None
class LinkedList:
def __init__(self):
self.Head = None
def printList(self):
current = self.Head
while current is not None:
print(current.data, end=" ")
current = current.next
print("")
def insertAtPosition(self, element, position):
counter = 1
current = self.Head
while counter < position - 1 and current is not None:
counter += 1
current = current.next
if position == 1:
newNode = Node(element)
newNode.next = current
self.Head = newNode
else:
newNode = Node(element)
newNode.next = current.next
current.next = newNode
def deleteFromLast(self):
if self.Head is None:
print("The linked list empty. Cannot delete an element.")
return
else:
current = self.Head
previous = None
while current.next is not None:
previous = current
current = current.next
previous.next = None
del current
myLinkedList = LinkedList()
myLinkedList.insertAtPosition(10, 1)
myLinkedList.insertAtPosition(20, 2)
myLinkedList.insertAtPosition(30, 3)
myLinkedList.insertAtPosition(40, 2)
print("The elements in the linked list are:")
myLinkedList.printList()
myLinkedList.deleteFromLast()
print("The elements in the linked list are:")
myLinkedList.printList()
myLinkedList.deleteFromLast()
print("The elements in the linked list are:")
myLinkedList.printList()
Producción :
The elements in the linked list are:
10 40 20 30
The elements in the linked list are:
10 40 20
The elements in the linked list are:
10 40
Eliminar el elemento en cualquier posición dada en la lista vinculada
Para eliminar un elemento en cualquier posición dada en la lista vinculada, primero verificaremos si la lista vinculada está vacía o no.
Para ello comprobaremos si el Head
de la lista enlazada apunta a None
. En caso afirmativo, informaremos al usuario que la lista vinculada está vacía y no tenemos ningún elemento para eliminar.
Si hay elementos presentes en la lista enlazada, y tenemos que eliminar un elemento en cualquier otra posición, seguiremos los siguientes pasos.
- Asignar el primer nodo a una variable
current
. - Inicializar una variable
previous
aNone
. - Inicializar una variable
contar
a 1. - Atraviese la lista enlazada usando un bucle
while
, incrementecount
en cada iteración, asigne el nodo en la variablecurrent
aprevious
, y avance la variablecurrent
al siguiente nodo hasta que elcount
la variable tiene laposición
del elemento a borrar o llegamos al final de la lista enlazada. En este punto, la variable actual se referirá al nodo que debe eliminarse. - Una vez que el conteo llega a ser igual a la posición del elemento a ser borrado, puede haber dos situaciones.
- Si todavía estamos en la
Head
, en la 1ª posición, asignaremos al atributoHead
el nodo al que hace referencia el atributonext
de la variable actual. Después de eso, eliminaremos la variablecurrent
. - Si no estamos en la 1ª posición, asignaremos el siguiente nodo de la variable
current
al siguiente atributo del nodo asignado a la variableprevious
. Eliminaremos el nodo asignado a la variablecurrent
. De esta forma, se eliminará el elemento en la posición dada.
Podemos implementar la lógica anterior en el método deleteAtPosition()
discutido a continuación.
class Node:
def __init__(self, data):
self.data = data
self.next = None
class LinkedList:
def __init__(self):
self.Head = None
def printList(self):
current = self.Head
while current is not None:
print(current.data, end=" ")
current = current.next
print("")
def insertAtPosition(self, element, position):
counter = 1
current = self.Head
while counter < position - 1 and current is not None:
counter += 1
current = current.next
if position == 1:
newNode = Node(element)
newNode.next = current
self.Head = newNode
else:
newNode = Node(element)
newNode.next = current.next
current.next = newNode
def deleteAtPosition(self, position):
if self.Head is None:
print("The linked list empty. Cannot delete an element.")
return
else:
current = self.Head
previous = None
count = 1
while current.next is not None and count < position:
previous = current
current = current.next
count += 1
if current == self.Head:
self.Head = current.next
del current
else:
previous.next = current.next
del current
myLinkedList = LinkedList()
myLinkedList.insertAtPosition(10, 1)
myLinkedList.insertAtPosition(20, 2)
myLinkedList.insertAtPosition(30, 3)
myLinkedList.insertAtPosition(40, 2)
print("The elements in the linked list are:")
myLinkedList.printList()
myLinkedList.deleteAtPosition(1)
print("The elements in the linked list are:")
myLinkedList.printList()
myLinkedList.deleteAtPosition(2)
print("The elements in the linked list are:")
myLinkedList.printList()
Producción :
The elements in the linked list are:
10 40 20 30
The elements in the linked list are:
40 20 30
The elements in the linked list are:
40 30
Cuente la cantidad de elementos en una lista vinculada en Python
Para contar el número de elementos en una lista enlazada, simplemente inicializaremos una variable contar
a 0.
Después de eso, comenzaremos desde el Head
y pasaremos al siguiente nodo usando un bucle while
hasta llegar al final de la lista enlazada. En cada iteración del bucle while
, incrementaremos el conteo
en 1.
Tras ejecutar el bucle while
, tendremos el número de elementos de la lista enlazada en la variable count
. Puede implementar esta lógica como se muestra en el método countElements()
a continuación.
class Node:
def __init__(self, data):
self.data = data
self.next = None
class LinkedList:
def __init__(self):
self.Head = None
def printList(self):
current = self.Head
while current is not None:
print(current.data, end=" ")
current = current.next
print("")
def insertAtPosition(self, element, position):
counter = 1
current = self.Head
while counter < position - 1 and current is not None:
counter += 1
current = current.next
if position == 1:
newNode = Node(element)
newNode.next = current
self.Head = newNode
else:
newNode = Node(element)
newNode.next = current.next
current.next = newNode
def countElements(self):
count = 0
current = self.Head
while current is not None:
count += 1
current = current.next
print("Number of elements in the linked list are:", count)
myLinkedList = LinkedList()
myLinkedList.insertAtPosition(10, 1)
myLinkedList.insertAtPosition(20, 2)
myLinkedList.insertAtPosition(30, 3)
myLinkedList.insertAtPosition(40, 2)
print("The elements in the linked list are:")
myLinkedList.printList()
myLinkedList.countElements()
Producción :
The elements in the linked list are:
10 40 20 30
Number of elements in the linked list are: 4
Actualizar un nodo en la lista vinculada en Python
Puede haber dos situaciones para actualizar el valor en un nodo en la lista enlazada.
- Necesitamos reemplazar un valor.
- Necesitamos asignar un nuevo valor al elemento en cualquier posición dada en la lista enlazada.
Reemplazar un valor en la lista vinculada
Para reemplazar un valor en la lista enlazada, comenzaremos desde el primer nodo y recorreremos la lista enlazada usando un bucle while
.
Verificaremos si el nodo current
contiene el valor a reemplazar en cada nodo. En caso afirmativo, reemplazaremos el valor en el nodo actual con el nuevo valor.
De esta forma, podemos actualizar la primera aparición de cualquier elemento en la lista enlazada como se muestra en el método replaceElement()
.
class Node:
def __init__(self, data):
self.data = data
self.next = None
class LinkedList:
def __init__(self):
self.Head = None
def printList(self):
current = self.Head
while current is not None:
print(current.data, end=" ")
current = current.next
print("")
def insertAtPosition(self, element, position):
counter = 1
current = self.Head
while counter < position - 1 and current is not None:
counter += 1
current = current.next
if position == 1:
newNode = Node(element)
newNode.next = current
self.Head = newNode
else:
newNode = Node(element)
newNode.next = current.next
current.next = newNode
def replaceElement(self, old_element, new_element):
current = self.Head
while current is not None:
if current.data == old_element:
current.data = new_element
break
current = current.next
myLinkedList = LinkedList()
myLinkedList.insertAtPosition(10, 1)
myLinkedList.insertAtPosition(20, 2)
myLinkedList.insertAtPosition(30, 3)
myLinkedList.insertAtPosition(40, 2)
print("The elements in the linked list are:")
myLinkedList.printList()
myLinkedList.replaceElement(30, 100)
print("The elements in the linked list are:")
myLinkedList.printList()
myLinkedList.replaceElement(20, 150)
print("The elements in the linked list are:")
myLinkedList.printList()
Producción :
The elements in the linked list are:
10 40 20 30
The elements in the linked list are:
10 40 20 100
The elements in the linked list are:
10 40 150 100
Actualice el elemento en una posición dada en la lista vinculada
Para actualizar el elemento en una posición dada en la lista enlazada, primero verificaremos si la lista enlazada está vacía. Si es así, puede haber dos situaciones.
Si la lista enlazada está vacía y tenemos que actualizar algún elemento que no sea la primera posición, avisaremos al usuario de que no se puede hacer.
Si la lista enlazada está vacía y tenemos que actualizar el elemento en la primera posición, crearemos un nuevo nodo con el elemento dado y asignaremos el nodo al Head
de la lista enlazada. De lo contrario, inicializaremos una variable contador
a 1.
Después de eso, recorreremos la lista enlazada usando un bucle while
. En cada iteración del bucle while
, nos moveremos al siguiente nodo en la lista enlazada, incrementaremos la variable contador
en 1 y comprobaremos si hemos llegado a la posición del elemento que necesita ser actualizado.
Si llegamos a la posición que necesita ser actualizada, actualizaremos el valor en el nodo actual de la lista enlazada y notificaremos al usuario.
Si no podemos llegar a la posición que necesita ser actualizada y el bucle while
termina, le notificaremos al usuario que no hay suficientes elementos y no podemos actualizar el valor. Esta lógica se puede implementar como se muestra a continuación en el método updateAtPosition()
.
class Node:
def __init__(self, data):
self.data = data
self.next = None
class LinkedList:
def __init__(self):
self.Head = None
def printList(self):
current = self.Head
while current is not None:
print(current.data, end=" ")
current = current.next
print("")
def insertAtPosition(self, element, position):
counter = 1
current = self.Head
while counter < position - 1 and current is not None:
counter += 1
current = current.next
if position == 1:
newNode = Node(element)
newNode.next = current
self.Head = newNode
else:
newNode = Node(element)
newNode.next = current.next
current.next = newNode
def updateAtPosition(self, new_element, position):
if self.Head is None and position != 1:
print("No element to update in the linked list.")
return
elif self.Head is None and position == 1:
newNode = Node(new_element)
self.Head = newNode
return
count = 1
current = self.Head
while current.next is not None and count < position:
count += 1
current = current.next
if count == position:
current.data = new_element
elif current.next is None:
print("Not enough elements in the linked list.")
myLinkedList = LinkedList()
myLinkedList.insertAtPosition(10, 1)
myLinkedList.insertAtPosition(20, 2)
myLinkedList.insertAtPosition(30, 3)
myLinkedList.insertAtPosition(40, 2)
print("The elements in the linked list are:")
myLinkedList.printList()
myLinkedList.updateAtPosition(100, 3)
print("The elements in the linked list are:")
myLinkedList.printList()
myLinkedList.updateAtPosition(150, 12)
print("The elements in the linked list are:")
myLinkedList.printList()
Producción :
The elements in the linked list are:
10 40 20 30
The elements in the linked list are:
10 40 100 30
Not enough elements in the linked list.
The elements in the linked list are:
10 40 100 30
Por qué usar una lista enlazada en Python
- Si no necesita acceso aleatorio a los elementos, las listas enlazadas pueden ser una mejor alternativa. Debe usar listas vinculadas en lugar de listas normales en Python cuando tenemos millones de elementos para almacenar y no necesitamos acceso aleatorio.
- El tamaño real de las listas es muy grande en comparación con el número de elementos presentes en ellas. El tamaño real de una lista es aproximadamente 1,5 veces el número de elementos presentes en ella. Asegura que tengamos suficiente memoria para insertar elementos en la lista. Sin embargo, una lista enlazada no requiere espacios adicionales.
- Cuando insertamos un elemento en la lista enlazada, solo se requiere almacenamiento. Las listas también requieren una ubicación de memoria contigua. Por el contrario, los nodos de una lista enlazada pueden estar presentes en cualquier lugar de la memoria física. Se conectan mediante referencias.
- Puede implementar estructuras de datos de pila y cola de manera eficiente utilizando listas vinculadas. Por otro lado, implementar una cola usando una lista es costoso en términos de complejidad de tiempo.
Lista enlazada de implementación completa en Python
El siguiente es el código de ejecución completo para implementar una lista vinculada en Python con todos los métodos discutidos en este artículo.
class Node:
def __init__(self, data):
self.data = data
self.next = None
class LinkedList:
def __init__(self):
self.Head = None
def printList(self):
current = self.Head
while current is not None:
print(current.data, end=" ")
current = current.next
print("")
def insertAtBeginning(self, element):
if self.Head is None:
newNode = Node(element)
self.Head = newNode
else:
newNode = Node(element)
newNode.next = self.Head
self.Head = newNode
def insertAtEnd(self, element):
if self.Head is None:
newNode = Node(element)
self.Head = newNode
else:
current = self.Head
while current.next is not None:
current = current.next
newNode = Node(element)
current.next = newNode
def insertAtPosition(self, element, position):
counter = 1
current = self.Head
while counter < position - 1 and current is not None:
counter += 1
current = current.next
if position == 1:
newNode = Node(element)
newNode.next = current
self.Head = newNode
else:
newNode = Node(element)
newNode.next = current.next
current.next = newNode
def deleteFromBeginning(self):
if self.Head is None:
print("The linked list empty. Cannot delete an element.")
return
else:
node = self.Head
self.Head = self.Head.next
del node
def deleteFromLast(self):
if self.Head is None:
print("The linked list empty. Cannot delete an element.")
return
else:
current = self.Head
previous = None
while current.next is not None:
previous = current
current = current.next
previous.next = None
del current
def deleteAtPosition(self, position):
if self.Head is None:
print("The linked list empty. Cannot delete an element.")
return
else:
current = self.Head
previous = None
count = 1
while current.next is not None and count < position:
previous = current
current = current.next
count += 1
if current == self.Head:
self.Head = current.next
del current
else:
previous.next = current.next
del current
def countElements(self):
count = 0
current = self.Head
while current is not None:
count += 1
current = current.next
print("Number of elements in the linked list are:", count)
def replaceElement(self, old_element, new_element):
current = self.Head
while current is not None:
if current.data == old_element:
current.data = new_element
break
current = current.next
def updateAtPosition(self, new_element, position):
if self.Head is None and position != 1:
print("No element to update in the linked list.")
return
elif self.Head is None and position == 1:
newNode = Node(new_element)
self.Head = newNode
return
count = 1
current = self.Head
while current.next is not None and count < position:
count += 1
current = current.next
if count == position:
current.data = new_element
elif current.next is None:
print("Not enough elements in the linked list.")
Conclusión
En este artículo, hemos discutido la estructura de datos de la lista enlazada y su implementación en Python. También hemos implementado los métodos para varias operaciones en una lista enlazada.
En este artículo, hemos implementado todas las operaciones usando métodos. También puede implementar cada operación usando funciones que toman el Head
de la lista enlazada como entrada y devuelven el encabezado después de ejecutar las operaciones requeridas.
Sin embargo, esto requerirá más recursos durante la ejecución. Por lo tanto, le sugiero que utilice el enfoque utilizado en este artículo.
Aditya Raj is a highly skilled technical professional with a background in IT and business, holding an Integrated B.Tech (IT) and MBA (IT) from the Indian Institute of Information Technology Allahabad. With a solid foundation in data analytics, programming languages (C, Java, Python), and software environments, Aditya has excelled in various roles. He has significant experience as a Technical Content Writer for Python on multiple platforms and has interned in data analytics at Apollo Clinics. His projects demonstrate a keen interest in cutting-edge technology and problem-solving, showcasing his proficiency in areas like data mining and software development. Aditya's achievements include securing a top position in a project demonstration competition and gaining certifications in Python, SQL, and digital marketing fundamentals.
GitHub