Menu
CoddyTech

Linked List

Terakhir diperbarui

Linked list adalah struktur data yang menyimpan urutan data sebagai rantai node, dan setiap node menyimpan sebuah nilai serta pointer ke node berikutnya. Tidak seperti array, node-node itu tidak bersebelahan di memori: kamu mengikuti pointer next untuk menelusuri list. Tekan Putar di atas untuk melihat node ditautkan di head dan tail, sebuah nilai dicari dengan menyusuri rantai, dan sebuah node dihapus dengan menautkan ulang pointer.

Menyisipkan atau menghapus di head bernilai O(1) karena kamu cukup mengarahkan ulang head. Mencapai posisi di tengah atau di tail bernilai O(n) karena kamu harus menelusurinya dulu. Pertukaran itu, ujung yang murah tanpa akses acak, adalah pembeda linked list dari array.

Kompleksitas waktu

OperasiKompleksitasCatatan
Sisipkan di headO(1)Arahkan ulang head
Sisipkan di tailO(n)Telusuri sampai akhir dulu (O(1) dengan pointer tail)
PencarianO(n)Ikuti pointer next
Hapus headO(1)Arahkan head melewatinya
Akses berdasarkan indeksO(n)Tidak ada akses acak

Linked list vs array

AspekLinked listArray
MemoriNode tersebar + pointerSatu blok bersebelahan
Akses acakO(n)O(1)
Sisipkan/hapus di depanO(1)O(n) (pergeseran)
Ramah cacheBurukBaik

Contoh penerapan

Membangun list [10, 20], menambahkan 5 di depan, lalu menghapus 20:

LangkahStrukturAksi
Mulaihead -> nullList kosong
Sisipkan 10 di headhead -> 10 -> nullArahkan head ke node baru yang next-nya adalah head lama (null)
Sisipkan 20 di tailhead -> 10 -> 20 -> nullTelusuri sampai node 10, atur next-nya ke node baru 20
Sisipkan 5 di headhead -> 5 -> 10 -> 20 -> nullNode baru 5 menunjuk ke head lama 10; head kini menunjuk ke 5
Hapus 20head -> 5 -> 10 -> nullTelusuri sampai 10, ubah next-nya dari 20 menjadi null; node 20 terlepas dari list

Kapan memakai linked list

Pakai saatHindari saat
Kamu jauh lebih sering menyisipkan atau menghapus di ujung (atau di node yang kamu pegang) daripada mengakses lewat indeksKamu butuh akses acak yang cepat berdasarkan posisi (pengindeksan O(1))
Ukurannya sering berubah dan kamu tidak mau ada biaya resize/salinKamu menjalankan loop ketat yang performanya didominasi lokalitas cache
Kamu sedang membangun queue, stack, atau adjacency listMemori terbatas: setiap node menanggung satu pointer tambahan per elemen
Kamu butuh referensi node yang stabil dan tetap berlaku meski ada penyisipan di tempat lainKamu lebih sering membaca dan jarang mengubah, jadi array lebih sederhana dan lebih cepat

Kode Linked List

Implementasi Linked List yang rapi dan siap dijalankan dalam Python, JavaScript, Java, C++, C. Pilih bahasa, salin kodenya, atau buka langsung di Coddy Playground.

Kode Linked List dalam Python

Python
1class Node:2    def __init__(self, value):3        self.value = value4        self.next = None5
6
7class LinkedList:8    def __init__(self):9        self.head = None10
11    def append(self, value):12        node = Node(value)13        if self.head is None:14            self.head = node15            return16        current = self.head17        while current.next:18            current = current.next19        current.next = node20
21    def find(self, value):22        current = self.head23        while current:24            if current.value == value:25                return True26            current = current.next27        return False28
29    def delete(self, value):30        # Re-link the previous node around the match31        current, prev = self.head, None32        while current:33            if current.value == value:34                if prev is None:35                    self.head = current.next36                else:37                    prev.next = current.next38                return True39            prev, current = current, current.next40        return False41
42    def __str__(self):43        values, current = [], self.head44        while current:45            values.append(str(current.value))46            current = current.next47        return " -> ".join(values) + " -> None"48
49
50lst = LinkedList()51for value in [3, 7, 1, 9]:52    lst.append(value)53
54print("List:    ", lst)55print("find(7): ", lst.find(7))56lst.delete(1)57print("After delete(1):", lst)
Jalankan kode ini di Playground Python

FAQ Linked List

Apa perbedaan linked list dan array?
Array menyimpan elemen dalam satu blok yang bersebelahan, sehingga memberi akses acak O(1) tetapi penyisipan/penghapusan O(n) karena elemen harus digeser. Linked list menyimpan node di mana saja di memori dan menghubungkannya dengan pointer, sehingga memberi penyisipan/penghapusan O(1) di posisi yang sudah diketahui tetapi akses O(n) karena kamu harus menyusuri rantainya.
Kapan sebaiknya memakai linked list?

Linked list unggul saat kamu sering menyisipkan atau menghapus di ujung (atau di node yang referensinya sudah kamu pegang) dan jarang butuh akses acak, misalnya untuk queue, stack, adjacency list, dan LRU cache. Jika kamu butuh akses cepat berdasarkan indeks, array atau dynamic array biasanya lebih baik.

Berapa kompleksitas waktu linked list?
Menyisipkan atau menghapus di head bernilai O(1). Mencari, atau mencapai tail tanpa pointer tail, bernilai O(n) karena kamu mengikuti pointer next satu per satu. Tidak ada akses acak O(1): mengakses linked list lewat indeks bernilai O(n).
Apa perbedaan singly dan doubly linked list?
Singly linked list hanya menyimpan pointer next per node, jadi kamu bisa menelusuri ke satu arah saja dan menghapus sebuah node membutuhkan referensi ke node pendahulunya. Doubly linked list menambahkan pointer prev, sehingga memungkinkan penelusuran mundur dan penghapusan O(1) untuk node yang kamu pegang, dengan harga satu pointer tambahan per node dan pencatatan yang lebih banyak pada setiap penyisipan dan penghapusan.
Mengapa menyisipkan di tail bernilai O(n) jika menyisipkan di head bernilai O(1)?
Menyisipkan di head hanya menautkan ulang pointer head, yang merupakan kerja konstan. Mencapai tail berarti mengikuti pointer next dari head sampai ke ujung, yang bernilai O(n). Menyimpan pointer tail terpisah membuat penyisipan di tail juga O(1), itulah sebabnya list di dunia nyata sering mencatat kedua ujungnya.
Apakah linked list punya penyisipan O(1) di mana saja?
Tidak, ini salah kaprah yang umum. Penyisipannya sendiri hanya bernilai O(1) jika kamu sudah memegang pointer ke node tempat kamu akan menyisipkan setelahnya. Mencari posisi itu berdasarkan nilai atau indeks tetap berbiaya O(n) karena kamu harus menyusuri rantai untuk sampai ke sana.
Ilustrasi bahasa pemrograman di Coddy

Kuasai algoritma bersama Coddy

Mulai