In un elenco collegato, ogni elemento ha un puntatore all'elemento successivo:
head -> item1 -> item2 -> item3 -> etc.
Per accedere item3
, puoi vedere chiaramente che devi camminare dalla testa attraverso ogni nodo fino a raggiungere l'elemento 3, poiché non puoi saltare direttamente.
Pertanto, se volessi stampare il valore di ogni elemento, se scrivo questo:
for(int i = 0; i < 4; i++) {
System.out.println(list.get(i));
}
quello che succede è questo:
head -> print head
head -> item1 -> print item1
head -> item1 -> item2 -> print item2
head -> item1 -> item2 -> item3 print item3
Questo è orribilmente inefficiente perché ogni volta che si sta indicizzando si riavvia dall'inizio dell'elenco e passa attraverso ogni elemento. Ciò significa che la tua complessità è effettivamente O(N^2)
solo per attraversare l'elenco!
Se invece ho fatto questo:
for(String s: list) {
System.out.println(s);
}
allora quello che succede è questo:
head -> print head -> item1 -> print item1 -> item2 -> print item2 etc.
tutto in un unico attraversamento, che è O(N)
.
Ora, andare al altre applicazioni di List
cui è ArrayList
, che uno è sostenuta da un semplice array. In quel caso entrambi i traversali di cui sopra sono equivalenti, poiché un array è contiguo, quindi consente salti casuali a posizioni arbitrarie.