Menu
CoddyTech

Doubly Linked List

Terakhir diperbarui

Doubly linked list adalah linked list yang setiap node-nya menyimpan dua pointer: next (ke node berikutnya) dan prev (ke node sebelumnya). Tautan mundur tambahan itu membuatmu bisa menelusuri list ke dua arah dan menghapus sebuah node dalam O(1) jika kamu sudah punya referensinya, karena kamu bisa langsung mencapai node pendahulunya tanpa berjalan dari head. Tekan Putar di atas untuk melihat node ditautkan dan ditautkan ulang ke dua arah.

Harganya adalah satu pointer tambahan per node dan pencatatan yang lebih banyak: setiap penyisipan dan penghapusan harus memperbarui next dan prev pada node tetangganya. Struktur ini menjadi dasar banyak deque dan LRU cache, yang membutuhkan penghapusan cepat dari kedua ujung.

Kompleksitas waktu

OperasiKompleksitasCatatan
Sisipkan di head/tailO(1)Dengan pointer head dan tail
Hapus node yang sudah diketahuiO(1)Langsung mencapai prev, tanpa menelusuri
PencarianO(n)Tetap pemindaian linear
Akses berdasarkan indeksO(n)Tidak ada akses acak

Singly vs doubly linked list

AspekSinglyDoubly
Pointer per node1 (next)2 (next + prev)
Menelusuri mundurTidakYa
Hapus node yang sudah diketahuiO(n) (cari prev)O(1)
Beban memoriLebih rendahLebih tinggi

Contoh penerapan

Membangun [10, 20, 30] dengan menambahkan di akhir, lalu menghapus node 20:

LangkahStrukturAksi
MulainullList kosong: head dan tail sama-sama null
Tambahkan 1010Node pertama; head dan tail sama-sama menunjuk ke node ini, prev = next = null
Tambahkan 2010 <-> 20Atur 10.next = 20 dan 20.prev = 10; tail = 20
Tambahkan 3010 <-> 20 <-> 30Atur 20.next = 30 dan 30.prev = 20; tail = 30
Hapus 2010 <-> 30Dengan 20.prev dan 20.next: atur 10.next = 30 dan 30.prev = 10 dalam O(1)

Kapan memakai doubly linked list

Pakai saatHindari saat
Kamu perlu menelusuri atau menyambung list ke dua arahKamu hanya pernah bergerak maju: singly linked list lebih ringan
Kamu menghapus node sembarang yang referensinya sudah kamu pegang (O(1))Kamu lebih sering mengakses berdasarkan posisi: pakai array untuk akses O(1)
Kamu mengimplementasikan deque, LRU cache, atau riwayat undo di layarMemori terbatas: pointer prev tambahan menggandakan beban tautan
Penyisipan dan penghapusan sering terjadi di kedua ujungDatanya kecil dan jarang berubah: menyalin array lebih murah

Kode Doubly Linked List

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

Kode Doubly Linked List dalam Python

Python
1class Node:2    def __init__(self, value):3        self.value = value4        self.prev = None5        self.next = None6
7
8class DoublyLinkedList:9    def __init__(self):10        self.head = None11        self.tail = None12
13    def append(self, value):14        node = Node(value)15        if self.tail is None:16            self.head = self.tail = node17            return18        # Wire both directions: old tail <-> new node19        node.prev = self.tail20        self.tail.next = node21        self.tail = node22
23    def prepend(self, value):24        node = Node(value)25        if self.head is None:26            self.head = self.tail = node27            return28        node.next = self.head29        self.head.prev = node30        self.head = node31
32    def forward(self):33        values, current = [], self.head34        while current:35            values.append(current.value)36            current = current.next37        return values38
39    def backward(self):40        values, current = [], self.tail41        while current:42            values.append(current.value)43            current = current.prev44        return values45
46
47lst = DoublyLinkedList()48for value in [2, 3, 4]:49    lst.append(value)50lst.prepend(1)51
52print("Forward: ", lst.forward())53print("Backward:", lst.backward())
Jalankan kode ini di Playground Python

FAQ Doubly Linked List

Apa perbedaan singly dan doubly linked list?
Singly linked list punya satu pointer per node (next), jadi kamu hanya bisa bergerak maju. Doubly linked list menambahkan pointer prev, sehingga kamu bisa menelusuri mundur dan menghapus node yang referensinya kamu pegang dalam O(1), dengan harga satu pointer tambahan per node dan pembaruan dua tautan pada setiap perubahan.
Kapan doubly linked list sepadan dengan memori tambahannya?
Saat kamu butuh penelusuran mundur atau penghapusan O(1) untuk node sembarang yang sudah kamu referensikan. Contoh klasiknya adalah deque (double-ended queue) dan LRU cache, yang entrinya sering dipindahkan dan dikeluarkan dari kedua ujung.
Mengapa doubly linked list bisa menghapus node dalam O(1)?
Untuk menghapus sebuah node, kamu harus menyambungkan node pendahulunya dengan node penerusnya. Pada singly linked list, kamu harus berjalan dari head untuk menemukan pendahulunya (O(n)); pada doubly linked list, pointer prev milik node itu langsung memberimu pendahulunya, jadi penautan ulangnya O(1).
Doubly linked list vs array: mana yang sebaiknya dipakai?
Pakai array saat kamu butuh akses O(1) berdasarkan indeks dan iterasi yang ramah cache, serta saat penyisipan kebanyakan terjadi di akhir. Pakai doubly linked list saat kamu sering menyisipkan atau menghapus di tengah atau di kedua ujung berdasarkan referensi node, karena itu bernilai O(1) dibandingkan pergeseran O(n) pada array. Array unggul dalam memori dan lokalitas; list unggul dalam perubahan struktur.
Apa itu sentinel node pada doubly linked list?
Sentinel node (atau dummy node) adalah node pengganti yang berada sebelum head dan/atau setelah tail sehingga list tidak pernah benar-benar kosong. Node ini menghilangkan pengecekan null untuk head, tail, serta penyisipan/penghapusan di batas list, sehingga setiap operasi mengikuti alur kode penautan ulang yang sama. Banyak implementasi LRU cache di produksi memakai dua sentinel untuk menghindari penanganan khusus di kedua ujung.
Apa bug paling umum saat menghapus dari doubly linked list?
Lupa memperbarui head atau tail saat menghapus node pertama atau terakhir, sehingga tersisa pointer menggantung ke node yang sudah dibebaskan. Selalu periksa apakah node.prev bernilai null (perbarui head) atau node.next bernilai null (perbarui tail) sebelum menautkan ulang node tetangganya.
Ilustrasi bahasa pemrograman di Coddy

Kuasai algoritma bersama Coddy

Mulai