edubun
Bahasa Indonesia

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, 4

Mengubah 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.

Memuat

Seret untuk memutar. Gulir atau cubit untuk memperbesar.

Singly linked list berisi empat node. Pilih posisi dengan penggeser lalu sisipkan atau hapus; penghitung memisahkan node yang dikunjungi dari pointer yang diubah. Cari berjalan dari head sampai menemukan nilainya atau null.
OperasiArray (n nilai)Linked list (n node)
Ambil nilai di posisi i1i + 1 kunjungan
Sisipkan di depann pemindahan + 1 penulisan2 perubahan pointer
Hapus bagian depan1 pembacaan + (n − 1) pemindahan1 perubahan pointer
Sisipkan di posisi i(n − i) pemindahan + 1 penulisani kunjungan + 2 perubahan
Cari sebuah nilaipaling banyak n pembacaanpaling 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.

Latar belakangLinked list muncul pada pertengahan tahun 1950-an bersama Information Processing Language (IPL), yang ditulis oleh Allen Newell, Cliff Shaw, dan Herbert Simon di RAND Corporation dan Carnegie Institute of Technology sekitar tahun 1956. Program mereka mencari bukti teorema logika, dan banyaknya serta ukuran hal yang harus mereka ingat tidak bisa diketahui sebelumnya. List berisi sel-sel yang tersambung memungkinkan memori dibagikan dan diambil kembali satu sel demi satu sel. Pemrosesan list dalam IPL memengaruhi Lisp, yang dirancang John McCarthy beberapa tahun kemudian.
  1. Dua bagian apa yang dimiliki node pada singly linked list?
    • item dan next
    • indeks dan nilai
    • kiri dan kanan
    • head dan tail
  2. List 12 → 7 → 30 → 4. Berapa langkah (perubahan pointer) yang dibutuhkan untuk menyisipkan nilai baru di depan?
  3. List yang sama: menyisipkan di posisi 2 memakan berapa langkah (kunjungan ditambah perubahan pointer)?
  4. List yang sama: berapa node yang dikunjungi saat mencari 30?
  5. List yang sama: berapa node yang dikunjungi saat mencari 99 sebelum mencapai null?
  6. List yang sama: menghapus node di posisi 3 (si 4) memakan berapa langkah?
  7. Sebuah array berisi 1000 nilai dan masih punya ruang. Berapa langkah untuk menyisipkan di depan?
  8. 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
  9. 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
  10. Bahasa apa, yang ditulis sekitar tahun 1956 di RAND, memperkenalkan pemrosesan list dengan sel-sel yang tersambung?
    • Fortran
    • IPL
    • C
    • JavaScript
Poin penting
  • 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