Double linked list
Link list yang kita pelajari sebelumnya hanya mempunyai sebuah pointer pada setiap simpulnya.
Hal ini merupakan kelemahan bahwa link list tersebut hanya bisa dibaca dalam satu arah saja,
yaitu dari kiri ke kanan. Hal yang seperti ini kurang cepat jika kita ingin mencari data di dalam
linklist
Untuk itulah kita memerlukan link list yang setiap simpulnya mempunyai 2 buah pointer ,
dengan pointer pertama menunjuk ke simpul sebelumnya (sebelah kiri) dan pointer kedua
menunjuk ke simpul sesudahnya (disebelah kanan). Hal ini akan mempermudah pembacaan (bisa
dilakukan dari kiri ke kanan dan dari kanan ke kiri), begitu juga untuk penambahan simpul baru
dan penghapusan simpul. Link list seperti ini disebut dengan Seranai Beranai Ganda (Double
linkedlist). Juga disebut dengan TwoWayList
Secara garis besar Double link list adalah link list yang memiliki dua buah pointer yang
menunjuk ke simpul sebelumnya (Prev) dan yang menunjuk ke simpul sesudahnya (Next).
Gambar berikut menunjukkan gambaran Double Link list
A
NULL B C D NULL
Gambar 1. Double linket list dengan empat simpul Deklarasi Double Linked List di dalam Pascal :
Type
PSimpul =^Simpul Simpul = Record
Info : char; Prev : PSimpul; Next : PSimpul; End;
Var
Head, Tail : PSimpul;
Ada beberapa hal yang harus diketahui mengenai Double link list, diantaranya adalah :
1. Double Link list selalu memiliki pointer petunjuk yang selalu menunjuk pada awal dari list
yang disebut Head
2. Double Link list juga selalu memiliki pointer petunjuk menunjuk pada akhir dari list yang
3. Setiap simpul yang terbentuk selalu memiliki nilai NIL , kecuali jika simpul tersebut sudah
ditunjuk oleh simpul yang lainnya (Double Link list belum terhubung).
4. Posisi simpul terakhir pada Doube link list selalu bernilai NIL karena ia tidak menunjuk pada
simpul yang lainnya, kecuali bentuk circular.
5. Operasi yang dapat dilakukan pada DoubleLink list diantaranya adalah :
a. Inisialisasi.
b. Menambah Simpul (di Depan, Belakang dan Tengah).
c. Menghapus Simpul (di Depan, Belakang dan Tengah).
d. Membaca isi link list.
1. Membuat Simpul Baru
Untuk membuat node baru digunakan keyword new. Perintah ini digunakan untuk
mempersiapkan sebuah node dengan alokasi memorinya. Selanjutnya medan informasi pada
node tersebut diisi dengan data tertentu. Terakhir pointer prev dan next diisi dengan NILL.
New(Baru);
Baru^.Info := Elemen; Baru^.Next := Nil; Baru^.Prev := Nil;
2. Menambah Simpul di Awal
Penambahan node baru yang akan diletakkan di node paling depan, perlu diperhatikan saat
pertama kali (data masih kosong), maka saat penambahan data dilakukan head/tail ditunjukkan
ke node baru tersebut. Sedangkan jika tidak kosong, data akan ditambahkan didepan head,
B next
Procedure TDep(Var Head, Tail : PSimpul; Elemen : Char); Var Baru : PSimpul;
3. Menambah Simpul di Belakang
Penambahan node di belakang akan selalu dikaitkan dengantaildan kemudian node baru tersebut
B next
Procedure TBel(Var Head, Tail : PSimpul; Elemen : Char); Var Baru : PSimpul;
4. Menghapus Simpul di Awal
Menghapus node tidak boleh dilakukan jika keadaan node sedang ditunjuk oleh pointer, maka
harus dilakukan penggunakan suatu pointer lain yang digunakan untuk menunjuk node yang
akan dihapus, misalnya pointer hapus. Kemudian head harus ditunjukkan ke node sesudahnya
terlebih dahulu agar list tidak putus, sehingga node setelah head lamaakan menjadihead baru.
Setelah itu barulah kemudian menghapus pointer hapus dengan menggunakan perintah delete.
A
NULL B C D NULL
head tail
hapus
B
NULL C D NULL
tail head
Procedure HDepan(Var Head, Tail : PSimpul); Var Hapus : PSimpul;
Begin
if head = nil then Write('List Kosong')
else if Head^.Next = Nil Then begin
Hapus := Head; Head := Nil; Tail := Nil; Dispose(Hapus) end
else Begin
Hapus := Head;
Head := Hapus^.Next; Head^.Prev := Nil; Dispose(Hapus); End
End;
5. Menghapus Simpul di Belakang
Menghapussimpul di belakang dibutuhkan satu buah pointer bantuan, misal pointerhapus, tidak
perlu melakukan perulangan untuk mencari node terakhir seperti pada single linked list. Pointer
hapus hanya perlu menunjuk pada pointer tail saja. Sebelum penghapusan node, tail harus
dipindahkan pada node sebelumnya. Selanjutnya pointernext daritail diberi nilaiNILL. Kemudian
A
NULL B C D NULL
head tail hapus
A
NULL B C
head tail
Procedure HBel(Var Head, Tail : PSimpul); Var Hapus : PSimpul;
Begin
if head = nil then Write('List Kosong')
else if Head^.Next = Nil Then begin
Hapus := Head; Head := Nil; Tail := Nil; Dispose(Hapus) end
else Begin
Hapus := Tail;
Tail := Hapus^.Prev; Tail^.Next := Nil; Dispose(Hapus); End