В связанном списке каждый элемент имеет указатель на следующий элемент:
head -> item1 -> item2 -> item3 -> etc.
Чтобы получить доступ item3
, вы можете ясно видеть, что вам нужно пройти от головы через каждый узел, пока не достигнете item3, поскольку вы не можете прыгать напрямую.
Таким образом, если я хочу напечатать значение каждого элемента, если я напишу это:
for(int i = 0; i < 4; i++) {
System.out.println(list.get(i));
}
происходит вот что:
head -> print head
head -> item1 -> print item1
head -> item1 -> item2 -> print item2
head -> item1 -> item2 -> item3 print item3
Это ужасно неэффективно, потому что каждый раз, когда вы индексируете, он перезапускается с начала списка и просматривает каждый элемент. Это означает, что ваша сложность заключается в том, O(N^2)
чтобы просто пройти по списку!
Если бы я сделал это:
for(String s: list) {
System.out.println(s);
}
тогда происходит следующее:
head -> print head -> item1 -> print item1 -> item2 -> print item2 etc.
все за один обход, то есть O(N)
.
Теперь, переходя к другой реализации из List
которых ArrayList
, что одна опирается на простой массив. В этом случае оба вышеуказанных обхода эквивалентны, поскольку массив является непрерывным, поэтому он допускает случайные переходы к произвольным позициям.