Was geht schneller, was langsamer?
Hier wird's spannend. Vergleich zwischen Array (ArrayList) und LinkedList:
| Operation | Array | LinkedList |
|---|
| Am Anfang einfügen (prepend) | O(n) — alle rutschen | O(1) — nur head umbiegen |
| Am Anfang entfernen (removeHead) | O(n) — alle rutschen | O(1) — head zeigt auf nächsten |
| Am Ende einfügen (append) | O(1) | O(n) — durch alle wandern |
| Index-Zugriff (get(5)) | O(1) | O(n) — durch alle wandern |
| Suchen | O(n) | O(n) |
| Löschen an Position | O(n) | O(n) |
Tausch der Stärken: Array ist gut am Ende und beim Index-Zugriff, LinkedList ist gut am Anfang.
Warum kein O(1) am Ende?
Weil die LinkedList nur weiß, wo der erste Knoten ist (head). Um zum Ende zu kommen, muss sie von head aus jeden next-Pointer einmal verfolgen. Bei 1.000 Knoten: 1.000 Schritte.
Optimierung: man kann zusätzlich einen tail-Pointer mitführen, dann ist append auch O(1). Aber Standard-Implementierungen haben das oft nicht.
Warum kein O(1) Index-Zugriff?
Bei list[5] wüsste die LinkedList nicht direkt wo Knoten 5 ist — die Knoten sind im Speicher verstreut. Sie muss von head aus 5x dem next-Pointer folgen.
Im Array dagegen liegen alle Elemente direkt hintereinander im Speicher. arr[5] ist ein einzelner Speicher-Sprung.
So sieht's im Code aus