Evitar la complejidad de pedir $O(n)$ posiciones de memoria (como necesitamos hacer con el Vector<T>
).
Nos gustaría una implementación que solicite la memoria por demanda para que agregar un elemento sea $O(1)$.
Para lograr esto los elementos de la línea no pueden estar contiguos.
Para poder relacionar elementos no contiguos entre sí vamos a usar nodos.
Los nodos son una estructura clásica de datos que alberga un dato y un puntero al siguiente elemento (también un nodo) de la lista.
Nodo es una estructura recursiva.
class Node {
public:
Node* next;
int data;
};
Listas compuestas por nodos.
Vamos a implementar una lista de enteros primero, ya que aún no vimos Templates.
class LinkedList {
public:
int Length;
Node* head;
LinkedList();
~LinkedList();
void add(int data);
void print();
};
LinkedList::LinkedList()
: length(0), head(NULL) {}
}
void LinkedList::add(int data) {
Node* node = new Node();
// Guardamos el elemento a agregar en un nodo nuevo
node -> data = data;
// Hacemos que el nuevo nodo apunte al
// comienzo de la lista
node -> next = this -> head;
// Hacemos que el comienzo de la lista sea este nodo
this -> head = node;
// Aumentamos la longitud en 1
this -> length++;
}
LinkedList::~LinkedList() {
Node<T>* temp = head;
// Creamos un nodo temp para iterar sobre la lista
while (temp != NULL) {
temp = temp -> next;
// Avanzo temp
delete(head);
// Borro el heap que apunta a head
// (la variable sigue existiendo porque está en el stack)
head = temp;
// Actualizo head con la nueva posición de temp
}
}