Em uma lista vinculada, cada elemento possui um ponteiro para o próximo elemento:
head -> item1 -> item2 -> item3 -> etc.
Para acessar item3
, você pode ver claramente que precisa percorrer todos os nós da cabeça até chegar ao item3, pois não pode pular diretamente.
Assim, se eu quisesse imprimir o valor de cada elemento, se eu escrever isso:
for(int i = 0; i < 4; i++) {
System.out.println(list.get(i));
}
o que acontece é o seguinte:
head -> print head
head -> item1 -> print item1
head -> item1 -> item2 -> print item2
head -> item1 -> item2 -> item3 print item3
Isso é terrivelmente ineficiente porque toda vez que você está indexando, ele é reiniciado no início da lista e passa por todos os itens. Isso significa que sua complexidade é efetivamente O(N^2)
apenas para percorrer a lista!
Se, em vez disso, eu fiz isso:
for(String s: list) {
System.out.println(s);
}
então o que acontece é o seguinte:
head -> print head -> item1 -> print item1 -> item2 -> print item2 etc.
tudo em uma única travessia, o que é O(N)
.
Agora, indo para o outro implementação do List
que é ArrayList
, que um é apoiado por uma matriz simples. Nesse caso, as duas travessias acima são equivalentes, uma vez que uma matriz é contígua e permite saltos aleatórios em posições arbitrárias.