En una lista vinculada, cada elemento tiene un puntero al siguiente elemento:
head -> item1 -> item2 -> item3 -> etc.
Para acceder item3
, puede ver claramente que necesita caminar desde la cabeza a través de cada nodo hasta llegar al elemento 3, ya que no puede saltar directamente.
Por lo tanto, si quisiera imprimir el valor de cada elemento, si escribo esto:
for(int i = 0; i < 4; i++) {
System.out.println(list.get(i));
}
lo que pasa es esto:
head -> print head
head -> item1 -> print item1
head -> item1 -> item2 -> print item2
head -> item1 -> item2 -> item3 print item3
Esto es terriblemente ineficiente porque cada vez que está indexando se reinicia desde el principio de la lista y revisa cada elemento. ¡Esto significa que su complejidad es efectivamente O(N^2)
solo para recorrer la lista!
Si en cambio hice esto:
for(String s: list) {
System.out.println(s);
}
entonces lo que pasa es esto:
head -> print head -> item1 -> print item1 -> item2 -> print item2 etc.
todo en un solo recorrido, que es O(N)
.
Ahora, ir a la otra puesta en práctica de List
la cual está ArrayList
, que uno está respaldado por una simple matriz. En ese caso, los dos recorridos anteriores son equivalentes, ya que una matriz es contigua, por lo que permite saltos aleatorios a posiciones arbitrarias.