17.9. La clase ListaEnlazada

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?

0