Na połączonej liście każdy element ma wskaźnik do następnego elementu:
head -> item1 -> item2 -> item3 -> etc.
Aby uzyskać dostęp item3
, możesz wyraźnie zobaczyć, że musisz przejść od głowy przez każdy węzeł, aż dotrzesz do elementu 3, ponieważ nie możesz skoczyć bezpośrednio.
Tak więc, gdybym chciał wydrukować wartość każdego elementu, jeśli napiszę to:
for(int i = 0; i < 4; i++) {
System.out.println(list.get(i));
}
co się dzieje to:
head -> print head
head -> item1 -> print item1
head -> item1 -> item2 -> print item2
head -> item1 -> item2 -> item3 print item3
Jest to okropnie nieefektywne, ponieważ za każdym razem, gdy indeksujesz, jest ono uruchamiane od początku listy i przechodzi przez wszystkie pozycje. Oznacza to, że Twoja złożoność polega na skutecznym O(N^2)
przejściu przez listę!
Jeśli zamiast tego zrobiłem to:
for(String s: list) {
System.out.println(s);
}
to co się dzieje to:
head -> print head -> item1 -> print item1 -> item2 -> print item2 etc.
wszystko w jednym przejściu, czyli O(N)
.
Teraz idzie na inne zastosowania List
, które jest ArrayList
, że jeden jest wspierany przez proste tablicy. W takim przypadku oba powyższe przejścia są równoważne, ponieważ tablica jest ciągła, więc umożliwia losowe skoki do dowolnych pozycji.