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 Listla 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.