2
Double Linked List
• Double : artinya field pointer-nya dua buah dan dua arah, yang menunjuk ke node sebelum dan sesudahnya.
• Berguna bila perlu melakukan pembacaan
linkedlist dari dua arah.
• Double linked list memiliki 2 buah pointer yaitu
pointer next dan prev.
Ilustrasi Node “Double”
• Ketika masih ada satu node maka kedua pointer
(next dan prev) akan menunjuk ke NULL)
• Double linked list dapat diakses dari dua arah :
1. Dari depan ke belakang (head ke tail) 2. Dari belakang ke depan (tail ke head)
prev DATA nex
Double Linked List
• Ketika double linked list memiliki banyak
node maka node yang paling depan pointer prev-nya menunjuk ke NULL. Sedangkan node yang paling belakang pointer next-nya yang menunjuk ke NULL.
a b c d e
null
firstNode
null
Pointer Head dan Tail
• Sama seperti single linked list, pada double
linked dibutuhkan pointer bantu yaitu head dan tail.
• Head : menunjuk pada node yang paling
depan.
• Tail : menunjuk pada node yang paling
Double Linked List
• Contoh ilustrasi double linked list yang
memiliki 4 node :
previous
“Double” Representation
Penjelasan:
• Pembuatan class bernama Node2P, yang berisi
variabel data bertipe Object dan 2 variabel pointer bertipe Node2P yaitu : next dan prev.
• Field data : digunakan untuk menyimpan
data/nilai pada linked list. Field pointer : digunakan untuk menyimpan alamat node berikutnya.
class Node2P {
int data; // data
Node2P next; // pointer next Node2P prev; // pointer prev }
Ilustrasi :
next
data
Class Node
public class Node2P { int data;
Node2P next;
Node2P previous;
Node2P() {}
Node2P(int theData) { data = theData;}
Node2P(int theData, Node2P thePrevious, Node2P theNext) {
data= theData;
previous = thePrevious; next = theNext;
9
Alokasi Simpul
Operasi Linked List
1. inisialisasi 2. isEmpty 3. size
4. Penambahan 5. Penghapusan 6. Penyisipan
7. Pencarian
11
(1) Inisialisasi Awal Pointer Head & Tail
Node2P head = null; Node2P tail= null;
(2)isEmpty
• Digunakan untuk mengetahui linked
dalam kondisi kosong.
• Kondisi kosong : jika size = 0 atau
jika head=tail=null.
boolean isEmpty() {
(3) size
• Digunakan untuk mengetahui banyak
node pada linked list.
• Size akan bertambah 1 setiap ada
node baru yang ditambahkan pada linked list.
• Size akan berkurang 1 setiap ada
penghapusan node.
int size() {
(4) Penambahan
• Dibedakan menjadi :
1. Penambahan dari depan
2. Penambahan dari belakang
Membentuk Simpul Awal
• Jika kondisi awal linked list kosong, maka
head dan tail sama-sama menunjuk node baru.
• head = tail= Baru
Penambahan dari Depan
• Jika linked list terdapat node, maka :
– Penambahan node baru diletakkan di
depan node yang ditunjuk oleh head.
– Pointer prev dari node depan diarahkan ke
node baru.
– Terjadi pergeseran pointer head kearah
Penambahan dari Depan
void addFirst(Node2P input){ if (isEmpty()){ head=input; tail=input; } else {
input.next = head;
head.previous = input; head = input;
18
Insert First
19
Insert First
20
Insert First
Penambahan dari Belakang
• Jika linked list terdapat node, maka :
– Penambahan node baru diletakkan di
belakang node yang ditunjuk oleh tail.
– Pointer next dari node belakang diarahkan
ke node baru.
– Terjadi pergeseran pointer tail kearah
Penambahan dari Belakang
void addLast(Node2P input){ if (isEmpty()){
head = input; tail = input; }
else {
input.previous = tail; tail.next = input; tail = input;
23
Insert Last
Kondisi awal linked list :
24
Insert Last
25
Insert Last
26
Insert Last
Penambahan Setelah Node x
• Penambahan node baru dilakukan
dibelakang node x (node tertentu).
• Node x adalah node yang memiliki
data yang sama dengan key.
• Jika tidak ditemukan node yang
Penambahan setelah Node x
void insertAfter(int key,Node2P input){ Node2P temp = head;
do{
if(temp.data==key){
input.previous = temp; input.next = temp.next;
temp.next.previous = input; temp.next = input;
size++;
System.out.println("Insert data is succeed.");
break; }
Insert After Node x
Kondisi awal linked list :
Insert After Node x
Dibutuhkan pointer bantu untuk mencari node x. Misalkan pointer bantu tersebut adalah after.
1. Node after = head;
Insert After Node x
32
Insert After Node x
33
Insert After Node x
34
Insert After Node x
35
Insert After Node x
Penambahan Sebelum Node x
• Penambahan node baru dilakukan
didepan node x (node tertentu).
• Node x adalah node yang memiliki
data yang sama dengan key.
• Jika tidak ditemukan node yang
Penambahan sebelum Node
tertentu
void insertBefore(Object key,Node2P input){ Node2P temp = head;
while (temp != null){ if (temp.data == key) {
if(temp == head) {
this.addFirst(input);
System.out.println("Insert data is succeed."); size++;
break; }
else {
input.previous = temp.previous; input.next = temp;
temp.previous.next = input; temp.previous = input;
System.out.println("Insert data is succeed."); size++;
break; }
}
38
Insert Before Node x
Kondisi awal linked list :
39
Insert Before Node x
1. Node before = head;
40
Insert Before Node x
41
Insert Before Node x
42
Insert Before Node x
43
Insert Before Node x
44
Insert Before Node x
(5) Penghapusan
• Dibedakan menjadi :
1. Hapus node depan
Penghapusan
• Jika linked list dalam keadaan
kosong maka tidak dapat dilakukan penghapusan.
• Jika pada linked list hanya terdapat 1
Hapus Node Depan
• Penghapusan dilakukan pada node
paling depan, yaitu node yang ditunjuk oleh head.
Hapus node depan
void removeFirst(){
Node2P temp = head; if (!isEmpty()){
if (head == tail)
head = tail = null; else
{
head.next.previous = null; head = temp.next;
} size--; }
else
System.out.println("Data is empty!");
49
Delete First
kondisi awal linked list:
50
Delete First
51
Delete First
52
Delete First
Delete First
53
54
Delete First
Hapus Node Belakang
• Penghapusan dilakukan pada node
paling belakang, yaitu node yang ditunjuk oleh tail.
Hapus node belakang
void removeLast(){
Node2P temp = tail; if (!isEmpty()){
if (tail == head){ head = tail = null; }
else {
tail.previous.next = null; tail=temp.previous;
} size--; }
else System.out.println("Data is empty!");
57
Delete Last
Kondisi awal linked list :
58
Delete Last
59
Delete Last
60
Delete Last
61
Delete Last
62
Delete Last
Hapus Node x
• Penghapusan dilakukan pada node x
(node tertentu).
• Node x adalah node yang memiliki data
sama dengan key.
• Jika tidak ditemukan node yang sesuai
Hapus node tertentu
void remove(int key){ Node2P temp = head; if (!isEmpty()){
while (temp != null){ if (temp.data == key){ if (temp == head){ this.removeFirst(); size--; break; } else {
if(temp.next == null){ tail=temp.previous; tail.next=null;
} else{
temp.previous.next = temp.next; temp.next.previous = temp.previous; }
size--; break; }
}
temp = temp.next; }
} else
System.out.println("Data is empty!"); size--;
65
Delete Node x
Kondisi awal linked list :
66
Delete Node x
1. Node hapus=head;
67
Delete Node x
68
Delete Node x
69
Delete Node x