Linked list
Menambahkan nilai di depan linked list mengubah dua pointer, entah list itu berisi 4 nilai atau 4 juta.
Nilai yang menunjuk ke nilai berikutnya
Array menyimpan nilai-nilainya berdampingan, dan karena itulah bagian depannya mahal untuk diubah. Linked list membuang aturan itu. Setiap nilai tinggal dalam catatan kecilnya sendiri yang disebut node (simpul), dan node-node itu bisa berada di mana saja di memori. Catatan 6.006 MIT menggambarkan node dengan dua bagian: item, dan next, yaitu pointer (penunjuk) ke node berikutnya. List itu sendiri hanya mengingat node pertama, yang disebut head. Next milik node terakhir bernilai null, yang menandai ujungnya.
Untuk membaca list, kamu mulai dari head lalu mengikuti pointer next satu per satu, seperti mengikuti rangkaian catatan yang masing-masing memberi tahu di mana catatan berikutnya disembunyikan. Itu ada biayanya. Tidak ada rumus untuk alamat node keempat, jadi mengambil nilai di posisi i berarti mengunjungi i + 1 node. MIT mencantumkan get at(i) untuk linked list sebagai O(n), padahal array melakukannya dalam satu langkah.
// satu node per nilai: { value, next }
let head = null;
for (const v of [4, 30, 7, 12]) head = { value: v, next: head };
// telusuri list
for (let n = head; n !== null; n = n.next) console.log(n.value); // 12, 7, 30, 4Mengubah list dengan menyambung ulang
Keuntungannya muncul saat kamu mengubah list. Untuk menaruh nilai baru di depan, buat node yang next-nya adalah head saat ini, lalu arahkan head ke node baru itu. Dua perubahan pointer, dan tidak ada yang lain yang bergeser. Menghapus node depan cukup satu perubahan: arahkan head ke head.next. Bandingkan dengan array, yang untuk operasi yang sama harus menggeser setiap nilai.
Di tengah list, pekerjaannya adalah mencari tempatnya. Untuk menyisipkan di posisi i, kamu berjalan ke node tepat sebelumnya (i kunjungan), lalu melakukan dua perubahan pointer yang sama: new.next = prev.next, lalu prev.next = new. Urutannya penting. Kalau prev.next diubah lebih dulu, sisa list hilang, karena tidak ada lagi yang menunjuk ke sana. Di laboratorium, satu langkah adalah satu node dikunjungi atau satu pointer diubah, jadi menyisipkan di posisi 2 pada list 4 node memakan 2 kunjungan ditambah 2 perubahan, 4 langkah.
Seret untuk memutar. Gulir atau cubit untuk memperbesar.
| Operasi | Array (n nilai) | Linked list (n node) |
|---|---|---|
| Ambil nilai di posisi i | 1 | i + 1 kunjungan |
| Sisipkan di depan | n pemindahan + 1 penulisan | 2 perubahan pointer |
| Hapus bagian depan | 1 pembacaan + (n − 1) pemindahan | 1 perubahan pointer |
| Sisipkan di posisi i | (n − i) pemindahan + 1 penulisan | i kunjungan + 2 perubahan |
| Cari sebuah nilai | paling banyak n pembacaan | paling banyak n kunjungan |
Kapan memakainya
Linked list cocok kalau sebagian besar perubahan terjadi di tempat yang pointer-nya sudah kamu pegang, seperti bagian depan, dan kamu jarang butuh posisi i. Antrean dan tumpukan bisa dibangun dari linked list, begitu pula rantai di dalam tabel hash pada unit berikutnya. Ada beberapa variasinya. Doubly linked list memberi setiap node pointer prev juga, sehingga kamu bisa berjalan mundur dan menghapus sebuah node dalam satu langkah begitu node itu kamu pegang. Menyimpan pointer tail selain head membuat penambahan di ujung menjadi murah.
Dalam JavaScript sehari-hari kamu jarang menulis linked list, karena array sudah dioptimalkan dengan baik dan cache pada prosesor modern lebih menyukai nilai yang disimpan berdampingan. Meski begitu, gagasannya tetap penting: pohon, graf, dan banyak struktur pustaka dibangun dari node dan pointer persis dengan cara ini.
- Dua bagian apa yang dimiliki node pada singly linked list?
- item dan next
- indeks dan nilai
- kiri dan kanan
- head dan tail
- List 12 → 7 → 30 → 4. Berapa langkah (perubahan pointer) yang dibutuhkan untuk menyisipkan nilai baru di depan?
- List yang sama: menyisipkan di posisi 2 memakan berapa langkah (kunjungan ditambah perubahan pointer)?
- List yang sama: berapa node yang dikunjungi saat mencari 30?
- List yang sama: berapa node yang dikunjungi saat mencari 99 sebelum mencapai null?
- List yang sama: menghapus node di posisi 3 (si 4) memakan berapa langkah?
- Sebuah array berisi 1000 nilai dan masih punya ruang. Berapa langkah untuk menyisipkan di depan?
- Pekerjaan mana yang lebih cocok untuk linked list daripada array?
- Membaca nilai di posisi 500 berkali-kali
- Menambah dan menghapus di depan berkali-kali
- Pencarian biner
- Mengurutkan berdasarkan indeks
- Saat menyisipkan sesudah node p, urutan langkah mana yang menjaga sisa list?
- p.next = new, lalu new.next = p.next
- new.next = p.next, lalu p.next = new
- Urutan mana pun bisa
- Hapus p lebih dulu
- Bahasa apa, yang ditulis sekitar tahun 1956 di RAND, memperkenalkan pemrosesan list dengan sel-sel yang tersambung?
- Fortran
- IPL
- C
- JavaScript
- Linked list menyimpan setiap nilai dalam node yang punya pointer next; list itu menyimpan head.
- Menyisipkan atau menghapus di depan mengubah 1 atau 2 pointer; tidak ada yang bergeser.
- Mencapai posisi i butuh i + 1 kunjungan, jadi get at(i) adalah O(n).
- Atur new.next sebelum menyambung ulang node sebelumnya.
Sumber kursus ini (11)
- MIT OpenCourseWare 6.006 Introduction to Algorithms, Spring 2020 (Demaine, Ku, Solomon)
- lecture notes 2 Data Structures (interface vs data structure, Sequence and Set interfaces, stack = insert_last/delete_last, queue = insert_last/delete_first, array, linked list, dynamic array, amortized Θ(1) append)
- 4 Hashing (chaining, pigeonhole collisions, chain length n/m)
- 6 Binary Trees Part 1 (height, traversal order, O(h) operations) and 7 Binary Trees Part 2: AVL (Adelson-Velsky and Landis, 1962) at ocw.mit.edu/courses/6-006-introduction-to-algorithms-spring-2020/pages/lecture-notes
- MDN Web Docs, Array.prototype.shift (shifts all values left by 1)
- Array.prototype.unshift, Map (insertion order, Map vs Object, spec requires sublinear average access) and Set (developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects)
- ECMAScript 2025 Language Specification (tc39.es/ecma262)
- 24.1 Map Objects and 24.2 Set Objects ("must be implemented using either hash tables or other mechanisms that, on average, provide access times that are sublinear on the number of elements")
- Array.prototype.shift steps (Repeat, while k < len: move element k to k - 1)
- D. E. Knuth, The Art of Computer Programming vol. 3 (2nd ed. 1998) section 6.4 History (H. P. Luhn, IBM internal memorandum January 1953, hashing with chaining; digit pairs added mod 10, 31415926 -> 4548) via gwern.net copy, and IEEE Spectrum, "Hans Peter Luhn and the Birth of the Hashing Algorithm" (2018)
- "A brief history of the stack", SIGCIS (sigcis.org/files/A brief history.pdf: Bauer and Samelson applied for the patent in 1957, US 3,047,228 granted July 31, 1962; IPL list processing by Newell, Simon and Shaw at RAND 1956) and Wikipedia, Information Processing Language (Newell, Shaw, Simon, RAND and Carnegie Institute of Technology, about 1956).
Diperiksa: 2026-10-18