Think Different materi ASD (UTS Semester Pendek) double linked list

LINKED LIST

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.
• Pointer next : mengarah ke node belakang (tail).
• Pointer prev : mengarah ke node depan (head).

2

Ilustrasi Node “Double”
prev

DATA

nex

t

• 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)

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.
firstNode

lastNode

null
null


a

b

c

d

e

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
belakang.


Double Linked List
• Contoh ilustrasi double linked list yang
memiliki 4 node :
previous

next

“Double” Representation
c la ss No d e 2P
{
int d a ta ; / / d a ta
No d e 2P ne xt;
/ / p o inte r ne xt
No d e 2P p re v;
/ / p o inte r p re v
}

Ilustrasi :
next
data

prev

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 Node
Constructor 1
null
public class Node2P {
int data;
Node2P next;
Node2P previous;

null

null
Constructor 2

Node2P() {}

null

Node2P(int theData)
{ data = theData;}

data
null

}

Node2P(int theData, Node2P thePrevious, Node2P theNext)
Constructor 3
{
next
data= theData;

previous = thePrevious;
data
next = theNext;
}
prev

Alokasi Simpul
No d e 2P b a ru = ne w No d e 2P(10);

9

Operasi Linked List
1.
2.
3.
4.
5.
6.
7.
8.


inisialisasi
isEmpty
size
Penambahan
Penghapusan
Penyisipan
Pencarian
Pengaksesan

(1) Inisialisasi Awal Pointer Head & Tail

No d e 2P he a d = null;
No d e 2P ta il= null;

head

NULL

tail


11

(2)isEmpty
• Digunakan untuk mengetahui linked
dalam kondisi kosong.
• Kondisi kosong : jika size = 0 atau
jika head=tail=null.
boolean isEmpty()
{
return size==0;
}

(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()
{
return size;
}

(4) Penambahan
• Dibedakan menjadi :
1. Penambahan dari depan
2. Penambahan dari belakang
3. Penambahan setelah node tertentu
4. Penambahan sebelum node tertentu

Membentuk Simpul Awal
• Jika kondisi awal linked list kosong, maka
head dan tail sama-sama menunjuk node
baru.
• head = tail= Baru

15


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
node baru.

Penambahan dari Depan
vo id a d d First(No d e 2P inp ut){
if (isEm p ty()){
he a d =inp ut;
ta il=inp ut;
}
e lse
{
inp ut.ne xt = he a d ;
he a d .p re vio us = inp ut;

he a d = inp ut;
} size ++;
}

Insert First
1. Baru.next = head

18

Insert First
2. head.prev = Baru

19

Insert First
3. head = baru

20

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
node baru.

Penambahan dari Belakang
vo id a d d La st(No d e 2P inp ut){
if (isEm p ty()){
he a d = inp ut;
ta il = inp ut;
}
e lse
{
inp ut.p re vio us = ta il;
ta il.ne xt = inp ut;
ta il = inp ut;
} size ++;
}

Insert Last
Kondisi awal linked list :
Terdapat 2 node

23

Insert Last
1. Baru.prev = tail

24

Insert Last
2. tail.next = Baru

25

Insert Last
3. tail= Baru

26

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
dimaksud maka penambahan tidak
terjadi.

Penambahan setelah Node x
vo id inse rtAfte r(int ke y,No d e 2P inp ut){
No d e 2P te mp = he a d ;
do {
if(te mp .d a ta ==ke y){
inp ut.p re vio us = te mp ;
inp ut.ne xt = te mp .ne xt;
te mp .ne xt.p re vio us = inp ut;
te mp .ne xt = inp ut;
size ++;
Syste m.o ut.p rintln("Inse rt d a ta is suc c e e d .");
b re a k;
}
te mp = te mp .ne xt;
}while (te mp !=null);
}

Insert After Node x
Kondisi awal linked list :
Terdapat 3 node pada linked list
misalkan key = 10

Insert After Node x
Dibutuhkan pointer bantu untuk mencari node x.
Misalkan pointer bantu tersebut adalah after.
1. Node after = head;

Pointer after akan bergeser mencari node yang
sesuai.

Insert After Node x
2. Baru.prev = after

Insert After Node x
3. Baru.next = after.next

32

Insert After Node x
4. after.next.prev = Baru

33

Insert After Node x
5. after.next = Baru

34

Insert After Node x
Hasil akhir :

35

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
dimaksud maka penambahan tidak
terjadi.

Penambahan sebelum Node
tertentu
vo id inse rtBe fo re (O b je c t ke y,No d e 2P inp ut){
No d e 2P te mp = he a d ;
while (te mp != null){
if (te mp .d a ta == ke y)
{
if(te mp == he a d )
{
this.a d d First(inp ut);
Syste m.o ut.p rintln("Inse rt d a ta is suc c e e d .");
size ++;
b re a k;
}
e lse
{
inp ut.p re vio us = te mp .p re vio us;
inp ut.ne xt = te mp ;
te mp .p re vio us.ne xt = inp ut;
te mp .p re vio us = inp ut;
Syste m.o ut.p rintln("Inse rt d a ta is suc c e e d .");
size ++;
b re a k;
}
}
te mp = te mp .ne xt;
}

Insert Before Node x
Kondisi awal linked list :
Terdapat 4 node pada linked list
misalkan key = 5

38

Insert Before Node x
1. Node before = head;
pointer before mencari node yang sesuai.

39

Insert Before Node x
2. Baru.prev = before.prev

40

Insert Before Node x
3. Baru.next = before

41

Insert Before Node x
4. before.prev.next = Baru

42

Insert Before Node x
5. before.prev = Baru

43

Insert Before Node x
Hasil akhir :

44

(5) Penghapusan
• Dibedakan menjadi :
1. Hapus node depan
2. Hapus node belakang
3. Hapus node tertentu

Penghapusan
• Jika linked list dalam keadaan
kosong maka tidak dapat dilakukan
penghapusan.
• Jika pada linked list hanya terdapat 1
node, maka head dan tail menunjuk
ke NULL.

Hapus Node Depan
• Penghapusan dilakukan pada node
paling depan, yaitu node yang ditunjuk
oleh head.
• Terjadi pergeseran head ke belakang.

Hapus node depan
vo id re mo ve First(){
No d e 2P te mp = he a d ;
if (!isEmp ty()){
if (he a d == ta il)
he a d = ta il = null;
e lse
{
he a d .ne xt.p re vio us = null;
he a d = te mp .ne xt;
} size --;
}
e lse
Syste m.o ut.p rintln("Da ta is e mp ty!");
}

Delete First
kondisi awal linked list:
Terdiri dari 5 node

49

Delete First
1. Node hapus = head;

50

Delete First
2. head.next.prev = null

51

Delete First
3. head = hapus.next

52

Delete First
Node 8 sudah terhapus

53

Delete First
Hasil akhir :

54

Hapus Node Belakang
• Penghapusan dilakukan pada node
paling belakang, yaitu node yang
ditunjuk oleh tail.
• Terjadi pergeseran tail ke depan.

Hapus node belakang
vo id re mo ve La st(){
No d e 2P te mp = ta il;
if (!isEmp ty()){
if (ta il == he a d ){
he a d = ta il = null;
}
e lse {
ta il.p re vio us.ne xt = null;
ta il=te mp .p re vio us;
} size --;
}
e lse Syste m.o ut.p rintln("Da ta is e mp ty!");
}

Delete Last
Kondisi awal linked list :
Linked list terdiri dari 4 node

57

Delete Last
1. Node hapus=tail;

58

Delete Last
2. tail.prev.next = null

59

Delete Last
3. tail= hapus.prev

60

Delete Last
Node 6 sudah terhapus

61

Delete Last
Hasil akhir :

62

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
maka penghapusan tidak dapat
dilakukan.

Hapus node tertentu
vo id re m o ve (int ke y){
No d e 2P te m p = he a d ;
if (!isEm p ty()){
w hile (te m p != null){
if (te m p .d a ta == ke y){
if (te m p == he a d ){
this.re m o ve First();
size --;
b re a k;
}
e lse
{
if(te m p .ne xt == null){
ta il=te m p .p re vio us;
ta il.ne xt=null;
}
e lse {
te m p .p re vio us.ne xt = te m p .ne xt;
te m p .ne xt.p re vio us = te m p .p re vio us;
}
size --;
b re a k;
}
}
te m p = te m p .ne xt;
}
}
e lse
Syste m .o ut.p rintln("Da ta is e m p ty!");
size --;
}

Delete Node x
Kondisi awal linked list :
Linked list memiliki 3 node. Misalkan key = 3

65

Delete Node x
1. Node hapus=head;
hapus adalah pointer bantu yang akan
mencari node yang dimaksud (node x).

66

Delete Node x
2. hapus.prev.next = hapus.next;

67

Delete Node x
3. hapus.next.prev = hapus.prev;

68

Delete Node x
Node 3 sudah terhapus

69