Tracks
/
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 encargaron crear una funcionalidad de listas de reproducción para tu aplicación de música.

Instrucciones

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

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

Dada una lista enlazada simple, debes poder invertir la lista para reproducir las canciones en el orden opuesto.

Note

La lista enlazada es una estructura de datos fundamental en las ciencias de la computación, y se usa a menudo en la implementación de otras estructuras de datos.

El tipo más simple 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 más en las listas enlazadas, echa un vistazo a este artículo, que lo explica con 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) que use una lista enlazada simple hecha a medida:


Diagrama que representa una pila implementada con una lista enlazada. A la izquierda del todo hay un círculo con borde discontinuo llamado New_Node, con dos líneas de flechas punteadas que apuntan hacia la derecha. New_Node dice «(becomes head) - New_Node - next = node_6». La línea de flecha punteada de arriba está etiquetada como «push» y apunta a Node_6, arriba y a la derecha. Node_6 dice «(current) head - Node_6 - next = node_5». La línea de flecha punteada de abajo está etiquetada como «pop» y apunta a un recuadro que dice «gets removed on pop()». Node_6 tiene una flecha sólida que apunta hacia la derecha a Node_5, que dice «Node_5 - next = node_4». Node_5 tiene una flecha sólida 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 «(current) tail - Node_1 - next = None». Node_1 tiene una flecha punteada que apunta hacia la derecha a un nodo que dice «None».


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


Diagrama que representa una pila implementada con un array/arreglo dinámico. A la derecha del todo hay un recuadro con borde discontinuo llamado New_Node, con dos líneas de flechas punteadas que apuntan hacia la izquierda. New_Node dice «(becomes head) - New_Node». La línea de flecha punteada de arriba está etiquetada como «append» y apunta a Node_6, arriba y a la izquierda. Node_6 dice «(current) head - Node_6». La línea de flecha punteada de abajo está etiquetada como «pop» y apunta a un recuadro con contorno punteado que dice «gets removed on pop()». Node_6 tiene una flecha sólida que apunta hacia la izquierda a Node_5. Node_5 tiene una flecha sólida que apunta hacia la izquierda a Node_4. Este patrón continúa hasta Node_1, que dice «(current) tail - Node_1».


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


Las clases en Python

La implementación «canónica» de una lista enlazada en Python normalmente requiere una o más classes. Para una buena introducción a classes, consulta la classes y el ejercicio complementario ellens-alien-game, o la sección de 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 la documentación de Python: personalización básica de objetos y la documentación de Python: object.len(self).


Cómo construir un iterador

Para poder recorrer tu LinkedList en un bucle o invertirla, 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.


Cómo personalizar y lanzar excepciones

A veces es necesario tanto personalizar como raise excepciones en tu código. Cuando lo hagas, siempre debes incluir 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.

Cuando 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 están bajo la clase Exception. Cuando lances el error, igual debes incluir un mensaje significativo.

Este ejercicio en particular 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, las lanzas con raise e incluyes 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 una pestaña nuevas
Python Exercism

¿Todo 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.