Dalam daftar tertaut, setiap elemen memiliki penunjuk ke elemen berikutnya:
head -> item1 -> item2 -> item3 -> etc.
Untuk mengakses item3
, Anda dapat melihat dengan jelas bahwa Anda perlu berjalan dari kepala melalui setiap node sampai Anda mencapai item3, karena Anda tidak dapat melompat secara langsung.
Jadi, jika saya ingin mencetak nilai setiap elemen, jika saya menulis ini:
for(int i = 0; i < 4; i++) {
System.out.println(list.get(i));
}
yang terjadi adalah ini:
head -> print head
head -> item1 -> print item1
head -> item1 -> item2 -> print item2
head -> item1 -> item2 -> item3 print item3
Ini sangat tidak efisien karena setiap kali Anda mengindeksnya dimulai ulang dari awal daftar dan melewati setiap item. Ini berarti kompleksitas Anda secara efektif O(N^2)
hanya untuk melintasi daftar!
Jika sebaliknya saya melakukan ini:
for(String s: list) {
System.out.println(s);
}
lalu yang terjadi adalah ini:
head -> print head -> item1 -> print item1 -> item2 -> print item2 etc.
semua dalam satu traversal, yaitu O(N)
.
Sekarang, pergi ke implementasi lain List
yang ArrayList
, yang didukung oleh array sederhana. Dalam kasus tersebut, kedua traversal di atas setara, karena larik berdekatan sehingga memungkinkan lompatan acak ke posisi arbitrer.