У пов'язаному списку кожен елемент має вказівник на наступний елемент:
head -> item1 -> item2 -> item3 -> etc.
Для доступу item3
ви чітко бачите, що вам потрібно ходити з голови через кожен вузол, поки не досягнете пункт 3, оскільки ви не можете перестрибувати безпосередньо.
Таким чином, якщо я хотів надрукувати значення кожного елемента, якщо я записую це:
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
, що це підтримується простим масивом. У цьому випадку обидва вищеперелічені траверси рівнозначні, оскільки масив є суміжним, тому він дозволяє випадковим стрибкам у довільні положення.