Existen ciertos problemas delicados con la forma en que se implementaron las listas. Invirtiendo el orden de causa y efecto, propondremos primero una implementación alternativa y explicaremos luego los problemas que esta resuelve.
En primer lugar crearemos un nueva clase llamada ListaEnlazada. Sus atributos son un entero que contiene la longitud de la lista y una referencia al primer nodo. Los objetos ListaEnlazada sirven de asas para la manipulación de las
listas de los objetos de tipo Nodo:
1: class ListaEnlazada :
2: def __init__(self) : 3: self.longitud = 0 4: self.cabeza = NoneUna ventaja de la clase ListaEnlazada es que suministra un marco natural para poner funciones-envoltorio como imprimeAlRevesBonito, que podemos convertir en un metodo de la clase ListaEnlazada:
1: class ListaEnlazada:
2: ... 3: def imprimeAlReves(self):4: print "[",
5: if self.cabeza != None:
6: self.cabeza.imprimeAlReves()7: print "]",
8: class Nodo:
9: ... 10: def imprimeAlReves(self):11: if self.siguiente != None:
12: cola = self.siguiente 13: cola.imprimeAlReves() 14: print self.carga,
Para complicar un poco mas las cosas, renombramos imprimeAlRevesBonito.
Ahora hay dos métodos llamados imprimeAlReves: uno en la clase Nodo (el ayudante), y otro en la clase ListaEnlazada (el envoltorio). Cuando el envoltorio llama a self.cabeza.imprimeAlReves, esta llamando al ayudante, ya que
self.cabeza es un objeto de tipo Nodo.
Otra ventaja de la clase ListaEnlazada es que facilita la forma de añadir o quitar el primer elemento de una lista. Por ejemplo, agregaPrimero es un metodo para ListaEnlazada; toma un elemento de la carga como argumento y lo coloca en el principio de la lista:
1: class ListaEnlazada:
2: ... 3: def agregaPrimero(self, carga): 4: nodo = Nodo(carga) 5: nodo.siguiente = self.cabeza 6: self.cabeza = nodo 7: self.longitud = self.longitud + 1Como suele ser usual, deberíamos comprobar este código para ver si maneja casos especiales.
Por ejemplo, que ocurriría si la lista esta inicialmente vacía?
Comentarios
Publicar un comentario