Software · Estructuras de Datos y Algoritmos

Operaciones Básicas de una Lista Enlazada, #2

Cuatro nodos emoji encerrados en círculos encadenados por flechas, un fuego, un dinosaurio, una mariposa y una cereza
Índice↑ Volver al inicio

Hey, ha pasado tiempo desde que escribí la primera parte. En esta secuela vamos a escribir algunos métodos que son muy útiles para las listas enlazadas, así que metámonos de lleno en el tema.

Prepend

El método prepend, como dice el nombre, añade un nodo al inicio de la lista enlazada. Es muy útil para cambiar el valor del head, y también para implementar pilas y colas.

La lógica del método prepend es la siguiente:

  • Crea un nuevo nodo.

  • Revisa si la lista enlazada está vacía. Si lo está, el nuevo nodo se convierte en el head y el tail de la lista.

  • Pon la referencia next del nuevo nodo apuntando al head actual de la lista.

  • Cambia la referencia del head de la lista para que apunte al nuevo nodo.

Lista Enlazada

Y ya, eso es todo, sencillo ¿no? Entonces el código es:

class LinkedList:

    #   previous code

    def prepend(self, value) -> bool:
        """
        Append to the the beginning of the ll a new node
        """
        new_node = Node(value=value)
        if self.length  == 0:
            self.head   =   new_node
            self.tail   =   new_node
            self.length =  1
        else:
            #Refers the new node to the LL
            new_node.next   = self.head
            #Set the head to the new node
            self.head       = new_node
            self.length     +=  1
        return True

Pop first

Este método nos permite eliminar el primer nodo de una lista enlazada y devolverlo. Para lograrlo tenemos que seguir estos pasos:

  • Revisa si la lista enlazada está vacía. Si lo está, devuelve None.

  • Si no está vacía, referencia el head (el nodo) en una variable temp.

  • Cambia el head para que referencie al siguiente nodo al que apuntaba el head actual.

  • El nodo que referenciaba la variable temp se pone en None.

  • Devuelve el valor de temp.

Lista Enlazada

Es un método muy simple, el código es:

class LinkedList:

    #   previous code

    def pop_firs(self) -> any:
        """
        Delete from the ll the first element and return it

        Return
            None:   If the lenght of the ll is 0
            Any:    The value of the node
        """
        if self.length == 0:
            return None
        else:
            temp = self.head
            self.head = self.head.next
            temp.next = None
            self.length -= 1
            if self.length == 0:
                self.tail = None
            return temp.value

Get

Este método devuelve la referencia a un nodo según un índice de la lista enlazada que se le pasa. El código es muy simple. Revisa estos pasos y juzga por ti mismo:

  • Primero, revisa si el índice pasado al método es válido.

  • Si no lo es, devuelve None.

  • Si es válido, recorre la lista enlazada hasta el índice del nodo.

  • Devuelve la referencia al nodo.

El código es:

class LinkedList:

    #   previous code
    def get(self, index) -> any:
        """
        Return the node according to the index pass to the function

        Return:
            None:   If the index its out of range or is less than 0
            Any:    The value of the node
        """
        if index < 0 or index > self.length:
            return None
        else:
            temp = self.head
            # The underscore is use to
            for _ in range(index):
                temp = temp.next
            return temp

Set value

Para implementar este método, cambiamos el valor de un nodo según el índice pasado como argumento. Usamos el método get descrito en el punto anterior. El pseudocódigo es el siguiente:

  • Usa el método get para obtener el nodo en la lista enlazada, 😅.

  • Si get devuelve None, no hagas ningún cambio.

  • Si get devuelve una referencia, cambia el atributo value del nodo por el nuevo valor pasado como argumento al método.

El código es:

class LinkedList:

    #   previous code

    def set_value(self, index, value) -> bool:
        """
        Change the value of a node according to the index pass to the function.

        Return
            True:   If the change was succesful
            False:  If the index it's out of range or less than 0
        """
        temp = self.get(index=index)

        if temp:
            temp.value = value
            return True
        return False

Insert

Este método es un poco más complicado que los otros tres descritos en los puntos anteriores. El método insert consiste en añadir un nuevo nodo en el índice pasado como argumento a la función. Para este método usamos algo del conocimiento aprendido en los métodos anteriores, en concreto la lógica del método get, y usamos variables para guardar las referencias.

La lógica del método insert es la siguiente:

  • Revisa si el índice pasado como argumento es válido.

  • Si no es válido, devuelve false.

  • Si es válido:

  • Si el índice pasado como argumento es igual a 0, podemos usar insert 🤌.

  • Si el índice pasado como argumento es igual a la longitud de la lista enlazada, usamos el método append 🤌.

  • En cualquier otro caso, hay que escribir un poco más de código:

  • Primero, crea un nuevo nodo.

  • Usa el método get para obtener la referencia al nodo anterior a la posición del índice donde queremos insertar.

  • Referencia el nuevo nodo a la siguiente referencia del nodo anterior.

  • Referencia el nodo anterior al nuevo nodo.

Lista Enlazada

Y eso es todo, ¡el código está listo!

class LinkedList:

    #   previous code

    def insert(self, index, value) -> bool:
        """
        Insert a new node in the ll according to the index pass to the function

        Return
            True:   If the insert was successful
            False:  If the index it's out of range or is less than zero
        """
        if index < 0 or index > self.length:
            return False
        if index == 0:
            self.prepend(value=value)
            return True
        elif index == self.length:
            self.append(value=value)
            return True
        else:
            new_node        = Node(value=value)
            temp            = self.get(index= index - 1)
            new_node.next   = temp.next
            temp.next       = new_node
            self.length     += 1
            return True

La canción del post

El cuarto de Tula, le cogió candela
Se quedó dormida y no apagó la vela
Candela, muchacho
Se volvió loco, Barbarito
¡Hay que ingresarlo!
· El Cuarto de Tula, Buena Vista Social Club

Escuchando