Anda di halaman 1dari 71

Algoritma dan Struktur Data

List Linear :

Linked List (Double Linkedlist)

Teknik Informatika Universitas Muhammadiyah Malang 2012

Tujuan Instruksional
Mahasiswa mampu :
Memahami struktur data linked list Memahami cara pengoperasian struktur data linked list Mengimplementasikan struktur data linked list

Topik
Bentuk dasar linked list deklarasi class linked list Tambah node Hapus node Penyisipan node ADT 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).

Ilustrasi Node Double


prev DATA next

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

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
class Node2P { int data; // data Node2P next; // pointer next Node2P prev; // pointer prev } 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.

Alokasi Simpul
Node2P baru = new Node2P(10);

10

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


Node2P head = null; Node2P tail= null;

head

NULL

tail

12

(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

16

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


void addFirst(Node2P input){ if (isEmpty()){ head=input; tail=input; } else { input.next = head; head.previous = input; head = input; } size++; }

Insert First
1. Baru.next = head

19

Insert First
2. head.prev = Baru

20

Insert First
3. head = baru

21

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


void addLast(Node2P input){ if (isEmpty()){ head = input; tail = input; } else { input.previous = tail; tail.next = input; tail = input; } size++; }

Insert Last
Kondisi awal linked list :
Terdapat 2 node

24

Insert Last
1. Baru.prev = tail

25

Insert Last
2. tail.next = Baru

26

Insert Last
3. tail= Baru

27

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


void insertAfter(Object 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; } temp = temp.next; }while (temp!=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

33

Insert After Node x


4. after.next.prev = Baru

34

Insert After Node x


5. after.next = Baru

35

Insert After Node x


Hasil akhir :

36

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


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; } } temp = temp.next; }

Insert Before Node x


Kondisi awal linked list : Terdapat 4 node pada linked list misalkan key = 5

39

Insert Before Node x


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

40

Insert Before Node x


2. Baru.prev = before.prev

41

Insert Before Node x


3. Baru.next = before

42

Insert Before Node x


4. before.prev.next = Baru

43

Insert Before Node x


5. before.prev = Baru

44

Insert Before Node x


Hasil akhir :

45

(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


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!"); }

Delete First
kondisi awal linked list: Terdiri dari 5 node

50

Delete First
1. Node hapus = head;

51

Delete First
2. head.next.prev = null

52

Delete First
3. head = hapus.next

53

Delete First
Node 8 sudah terhapus

54

Delete First
Hasil akhir :

55

Hapus Node Belakang


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

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!"); }

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

58

Delete Last
1. Node hapus=tail;

59

Delete Last
2. tail.prev.next = null

60

Delete Last
3. tail= hapus.prev

61

Delete Last
Node 6 sudah terhapus

62

Delete Last
Hasil akhir :

63

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


void remove(Object key){ Node2P temp = head; if (!isEmpty()){ while (temp != null){ if (temp.data == key){ if (temp == head){ this.removeFirst(); size--; break; } else { temp.previous.next = temp.next; temp.next.previous = temp.previous; if(temp.next == null) tail=temp; size--; break; } } temp = temp.next; } } else System.out.println("Data is empty!"); size--; }

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

66

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

67

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

68

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

69

Delete Node x
Node 3 sudah terhapus

70

Sumber
Arna Fariza, Algoritma Struktur Data : Double Linked List, PENS-ITS, Surabaya

71

Anda mungkin juga menyukai