In einer verknüpften Liste hat jedes Element einen Zeiger auf das nächste Element:
head -> item1 -> item2 -> item3 -> etc.
Um darauf zugreifen zu können item3
, können Sie deutlich sehen, dass Sie vom Kopf durch jeden Knoten gehen müssen, bis Sie Punkt 3 erreichen, da Sie nicht direkt springen können.
Wenn ich also den Wert jedes Elements drucken möchte, wenn ich Folgendes schreibe:
for(int i = 0; i < 4; i++) {
System.out.println(list.get(i));
}
Was passiert ist folgendes:
head -> print head
head -> item1 -> print item1
head -> item1 -> item2 -> print item2
head -> item1 -> item2 -> item3 print item3
Dies ist schrecklich ineffizient, da es jedes Mal, wenn Sie indizieren, am Anfang der Liste neu startet und jedes Element durchläuft. Dies bedeutet, dass Ihre Komplexität effektiv O(N^2)
nur darin besteht, die Liste zu durchlaufen!
Wenn ich stattdessen folgendes tun würde:
for(String s: list) {
System.out.println(s);
}
dann passiert folgendes:
head -> print head -> item1 -> print item1 -> item2 -> print item2 etc.
alles in einer einzigen Durchquerung, das heißt O(N)
.
Jetzt gehen, auf die andere Implementierung von List
denen ArrayList
, die man durch eine einfache Anordnung unterstützt wird. In diesem Fall sind beide oben genannten Durchläufe äquivalent, da ein Array zusammenhängend ist und zufällige Sprünge zu beliebigen Positionen ermöglicht.