Rutas
/
Python
Python
/
Ejercicios
/
Lista enlazada simple
Lista enlazada simple

Lista enlazada simple

Fácil

Introducción

Trabajas para una empresa de streaming de música.

Te han encargado crear una funcionalidad de listas de reproducción para tu aplicación de reproducción de música.

Instrucciones

Escribe un prototipo de la aplicación de reproductor de música.

Para el prototipo, cada canción se representará simplemente con un número. Dado un rango de números (los identificadores de las canciones), crea una lista enlazada simple.

Dada una lista enlazada simple, deberías poder invertir la lista para reproducir las canciones en el orden inverso.

Note

La lista enlazada es una estructura de datos fundamental en informática y se usa a menudo en la implementación de otras estructuras de datos.

El tipo más sencillo de lista enlazada es la lista enlazada simple. Eso significa que cada elemento (o «nodo») contiene datos, junto con algo que apunta al siguiente nodo de la lista.

Si quieres profundizar en las listas enlazadas, echa un vistazo a este artículo, que lo explica con unos dibujos muy claros.

Cómo está estructurado este ejercicio en Python

Aunque las stacks y las queues se pueden implementar con lists, collections.deque, queue.LifoQueue y multiprocessing.Queue, este ejercicio espera una pila "último en entrar, primero en salir" (LIFO) usando una lista enlazada simple hecha a medida:


Diagrama que representa una pila implementada con una lista enlazada. En el extremo izquierdo hay un círculo con borde discontinuo llamado New_Node, con dos líneas de puntos con flecha que apuntan hacia la derecha. New_Node dice «(se convierte en head) - New_Node - next = node_6». La línea de puntos superior está etiquetada como «push» y apunta a Node_6, arriba y a la derecha. Node_6 dice «(head actual) - Node_6 - next = node_5». La línea de puntos inferior está etiquetada como «pop» y apunta a un recuadro que dice «se elimina con pop()». Node_6 tiene una flecha continua que apunta hacia la derecha a Node_5, que dice «Node_5 - next = node_4». Node_5 tiene una flecha continua que apunta hacia la derecha a Node_4, que dice «Node_4 - next = node_3». Este patrón continúa hasta Node_1, que dice «(tail actual) - Node_1 - next = None». Node_1 tiene una flecha de puntos que apunta hacia la derecha a un nodo que dice «None».


Esto no debe confundirse con una pila LIFO que use un array dinámico o una list, que puede usar por debajo una list, una queue o un array. Las stacks basadas en arrays dinámicos tienen una posición de head distinta, además de una complejidad temporal (Big-O) y un consumo de memoria diferentes.


Diagrama que representa una pila implementada con un array/array dinámico. En el extremo derecho hay un recuadro con borde discontinuo llamado New_Node, con dos líneas de puntos con flecha que apuntan hacia la izquierda. New_Node dice «(se convierte en head) - New_Node». La línea de puntos superior está etiquetada como «append» y apunta a Node_6, arriba y a la izquierda. Node_6 dice «(head actual) - Node_6». La línea de puntos inferior está etiquetada como «pop» y apunta a un recuadro con contorno de puntos que dice «se elimina con pop()». Node_6 tiene una flecha continua que apunta hacia la izquierda a Node_5. Node_5 tiene una flecha continua que apunta hacia la izquierda a Node_4. Este patrón continúa hasta Node_1, que dice «(tail actual) - Node_1».


Consulta estas dos preguntas de Stack Overflow para ver algunas consideraciones: Pilas y colas basadas en arrays frente a basadas en listas enlazadas y Diferencias entre pila de array, pila enlazada y pila. Para más detalles sobre las listas enlazadas, las pilas LIFO y otros tipos de datos abstractos (ADT) en Python:


Clases en Python

La implementación "canónica" de una lista enlazada en Python suele requerir una o más classes. Para una buena introducción a las classes, consulta classes y el ejercicio complementario ellens-alien-game, o la sección sobre clases del tutorial oficial de Python.


Métodos especiales en Python

Los tests de este ejercicio llamarán a len() sobre tu LinkedList. Para que len() funcione, tendrás que crear un método especial __len__. Para más detalles sobre cómo implementar métodos especiales o "dunder" en Python, consulta Documentación de Python: personalización básica de objetos y Documentación de Python: object.len(self).


Crear un iterador

Para poder recorrer con un bucle o invertir tu LinkedList, tendrás que implementar el método especial __iter__. Consulta cómo implementar un iterador para una clase para ver los detalles de implementación.


Personalizar y lanzar excepciones

A veces es necesario tanto personalizar como raise excepciones en tu código. Cuando lo hagas, deberías incluir siempre un mensaje de error significativo que indique cuál es el origen del error. Esto hace que tu código sea más legible y ayuda mucho a la hora de depurar.

Las excepciones personalizadas se pueden crear mediante nuevas clases de excepción (consulta classes para más detalles) que normalmente son subclases de Exception.

En situaciones en las que sepas que el origen del error será una derivada de cierto tipo de excepción, puedes optar por heredar de uno de los built in error types que hay bajo la clase Exception. Al lanzar el error, deberías seguir incluyendo un mensaje significativo.

Este ejercicio en concreto requiere que crees una excepción personalizada que se lance («arroje») cuando tu lista enlazada esté vacía. Los tests solo pasarán si personalizas las excepciones adecuadas, lanzas esas excepciones con raise e incluyes los mensajes de error adecuados.

Para personalizar una excepción genérica, crea una class que herede de Exception. Cuando lances la excepción personalizada con un mensaje, escribe el mensaje como argumento del tipo exception:

# subclassing Exception to create EmptyListException
class EmptyListException(Exception):
    """Exception raised when the linked list is empty.

    message: explanation of the error.

    """
    def __init__(self, message):
        self.message = message

# raising an EmptyListException
raise EmptyListException("The list is empty.")
Editar en GitHub El enlace se abre en una ventana o pestaña nueva
Python Exercism

¿Listo para empezar Lista enlazada simple?

Regístrate en Exercism para aprender y dominar Python con 17 conceptos146 ejercicios y mentoría humana real, todo gratis.