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 = None
Una 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 + 1
Como 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