Dokumen - IK - STMIK EL RAHMA Double linked list

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
link list
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
linked list). Juga disebut dengan Two Way List

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

NULL

A

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
disebut Tail.

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,
kemudian node baru akan berubah menjadi head.

NULL

NULL

head tail

NULL

prev


A

next

prev

A

next

prev

NULL NULL

prev

next

baru


B

prev

A

next

baru

head

prev

NULL

tail

next


NULL

tail

B

head

baru

NULL

head

B

head

baru


NULL

prev

next

NULL

tail

B

next

NULL

tail

Procedure TDep(Var Head, Tail : PSimpul; Elemen : Char);

Var Baru : PSimpul;
Begin
New(Baru);
Baru^.Info := Elemen;
Baru^.Next := Nil;
Baru^.Prev := Nil;
if head = nil then
begin
head := baru;
tail := baru
end
else
begin
Baru^.Next := Head;
Head^.Prev := Baru;
Head := Baru
end
End;

3. Menambah Simpul di Belakang

Penambahan node di belakang akan selalu dikaitkan dengan tail dan kemudian node baru tersebut
akan menjadi tail.

NULL

NULL

prev

head tail

NULL

prev

B

head

NULL


prev

prev

NULL

NULL

prev

tail

B

head

NULL

next


head

next

next

baru

A

next

NULL

tail

next

NULL

next

NULL

next

NULL

baru

prev

tail

B

B

A

baru

prev

head

tail

A

baru

Procedure TBel(Var Head, Tail : PSimpul; Elemen : Char);
Var Baru : PSimpul;
Begin
New(Baru);
Baru^.Info := Elemen;
Baru^.Next := Nil;
Baru^.Prev := Nil;
if head = nil then
begin
head := baru;
tail := baru
end
else
begin
Tail^.Next := Baru;
Baru^.prev := Tail;
Tail := Baru
end
End;

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 lama akan menjadi head baru.
Setelah itu barulah kemudian menghapus pointer hapus dengan menggunakan perintah delete.
Jika head masih NIL maka berarti data masih kosong!

NULL

hapus

A

B

C

D

head

NULL

tail

NULL

B

C

head

D

NULL

tail

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
Menghapus simpul di belakang dibutuhkan satu buah pointer bantuan, misal pointer hapus, 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 pointer next dari tail diberi nilai NILL. Kemudian
langkah terakhir simpul hapus di-delete

NULL

A

B

C

head

NULL

A

D

tail

B

head

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
End;

C

tail

NULL

hapus