60
Linked List Aciek Ida Wuryandari

Linked List

Embed Size (px)

DESCRIPTION

Penjelasan mengenai Linked List

Citation preview

Page 1: Linked List

Linked List

Aciek Ida Wuryandari

Page 2: Linked List

Definisi

• Linked List adalah salah satu bentuk struktur data, berisi

kumpulan data (node) yang tersusun secara sekuensial,

saling sambung-menyambung, dinamis dan terbatas.

• Masing-masing data dalam Linked List disebut dengan node

(simpul) yang menempati alokasi memori secara dinamis dan

biasanya berupa struct yang terdiri dari beberapa field.

2

Page 3: Linked List

Struktur Data Linked List

[0] [1] [2] array

A B C Array

linked

A B C Linked list

Linked list jumlahnya tak terbatas (hanya dibatasi oleh memory)

node

Page 4: Linked List

Array VS Linked List

4

Page 5: Linked List

Array VS Linked List

Menyimpan koleksi elemen secara non-contiguously.

Elemen dapat terletak pada lokasi memory yang saling berjauhan. Bandingkan dengan array dimana tiap-tiap elemen akan terletak pada lokasi memory yang berurutan.

a b c d e

c a e d b

Array representation

Linked list representation

Page 6: Linked List

Array VS Linked List

Mengizinkan operasi insert atau remove elemen ditengah-

tengah koleksi dengan hanya membutuhkan jumlah

perpindahan elemen yang konstan.

Bandingkan dengan array. Berapa banyak elemen yang

harus dipindahkan bila akan menyisipi elemen ditengah-

tengah array?

Page 7: Linked List

Kerugian Dan Keuntungan Linked

List KERUGIAN: 1. Diperlukan ruang tambahan untuk menyatakan/

menempat kan field pointer. 2. Diperlukan waktu yang lebih banyak untuk mencari

suatu node dalam linked list (karena sifatnya yang sekuensial)

KEUNTUNGAN: 1. Pengalokasian ruang memori dilakukan tanpa

pendeklarasian sebelumnya dan terbatas pada jumlah ruang memori yang tersisa (disediakan).

2. Operasi REMOVE atau INSERT dapat dilakukan hanya dengan mengubah pointer-nya saja.

Page 8: Linked List

Linked List

• Linked list dibedakan menjadi 2 :

▫ Single linked list

▫ Double linked list

▫ Circular linked list

Page 9: Linked List

Gambaran Struktur Node

null

Link atau pointer

data

null

null

Single linked-list Double linked-list

Page 10: Linked List

Single Linked List

• Single : artinya pointer-nya hanya satu buah dan satu

arah, yaitu menunjuk ke node sesudahnya.

• Ilustrasi :

10

25 12 17 10

First Last

(1) (2) (3) (4)

Page 11: Linked List

Ilustrasi Single Linked List • Ilustrasi single linked list pada memory :

• Node e tidak menunjuk ke node manapun sehingga

pointer dari node e adalah NULL. Dapat disimpulkan

bahwa node ini adalah node yang paling belakang (node

ekor).

c a e d b

Ekor

Page 12: Linked List

Ilustrasi Single Linked List

• Ilustrasi single linked list pada memory :

• Karena node tidak ditunjuk oleh node manapun maka node ini adalah node yang paling depan (node kepala).

Kepala

c a e d b

Page 13: Linked List

Operasi Linked List

1. Inisialisasi

2. isEmpty

3. Size

4. Penambahan

5. Penghapusan

6. Pengaksesan

Page 14: Linked List

Class Node

public class Node { Object data; Node pointer; Node() { } Node(Object data) { this.data = data; } Node(Object data, Node pointer) { this.data = data; this.pointer = pointer; } } //program menggunakan java

null

null

null

element

next

element

Constructor 1

Constructor 2

Constructor 3

Page 15: Linked List

(1) inisialisasi

• Proses ini digunakan untuk mendeklarasi sekaligus memberikan nilai awal (inisialisasi) pada pointer head dan tail.

• Nilai awal kedua pointer tersebut adalah NULL. Yang menandakan bahwa linked list dalam kondisi kosong (belum ada node yang terbentuk).

Node head,tail; void inisialisasi() { head=tail=null; } //program menggunakan java

Page 16: Linked List

(2) isEmpty

• Digunakan untuk mengetahui linked dalam kondisi kosong.

• Kondisi kosong : jika size = 0 atau jika head=tail=null.

boolean isEmpty() { return size==0; } //program menggunakan java

Page 17: Linked List

(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; } //program menggunakan java

Page 18: Linked List

(4) Penambahan

Dibedakan menjadi :

1. Penambahan dari depan

2. Penambahan dari belakang

3. Penambahan setelah node tertentu

4. Penambahan sebelum node tertentu

Page 19: Linked List

Penambahan dari Depan

• Jika kondisi awal node kosong, maka head dan tail akan sama-sama menunjuk ke node input.

• Jika pada linked list telah ada node, maka head akan menunjuk ke node input (hanya head yang bergerak).

void addFirst(Node input){ if (isEmpty()){ head=input; tail=input; } else { input.pointer = head; head = input; } size++; } //program menggunakan java

Page 20: Linked List

Ilustrasi : addFirst(x)

Menambahkan X pada lokasi paling depan.

a b c d

head

x b

head

c d a

x Kondisi awal pada linked list :

Setelah penambahan node x didepan:

Node input

Page 21: Linked List

Penambahan dari Belakang

• Jika kondisi awal node kosong, maka head dan tail akan sama-sama menunjuk ke node input.

• Jika pada linked list telah ada node, maka tail akan menunjuk ke node input (hanya tail yang bergerak).

void addLast(Node input){ if (isEmpty()){ head = input; tail = input; } else { tail.pointer = input; tail = input; } size++; } //program menggunakan java

Page 22: Linked List

Ilustrasi : addLast(x)

menambahkan X pada akhir list :

a b c

tail

d x

a b c d

tail

x

Node input

Kondisi awal pada linked list :

Setelah penambahan node x dibelakang :

Page 23: Linked List

Contoh program public class TestLinkedList { public static void main(String[] args) { LinkedList1 list = new LinkedList1(); System.out.println("head : " + list.head); System.out.println("tail : " + list.tail); list.addFirst(new Node()); System.out.println("head : " + list.head); System.out.println("tail : " + list.tail); list.addFirst(new Node()); System.out.println("head : " + list.head); System.out.println("tail : " + list.tail); list.addLast(new Node()); System.out.println("head : " + list.head); System.out.println("tail : " + list.tail); } } //program menggunakan java

Page 24: Linked List

Output

head : null tail : null head : Node@19821f tail : Node@19821f head : Node@addbf1 tail : Node@19821f head : Node@addbf1 tail : Node@42e816 //program menggunakan java

Page 25: Linked List

Penambahan Setelah Node Tertentu

• Dilakukan pencarian node yang memiliki data yang sama dengan key.

void insertAfter(Object key,Node input){ Node temp = head; do{ if(temp.data==key){ input.pointer = temp.pointer; temp.pointer = input; size++; System.out.println("Insert data is succeed."); break; } temp = temp.pointer; }while (temp!=null); } //program menggunakan java

Page 26: Linked List

Ilustrasi : Insert After(a)

Menyisipkan X pada lokasi setelah temp.

a b c d

temp

a b

x temp

c d x

Page 27: Linked List

Penambahan Sebelum Node Tertentu void insertBefore(Object key,Node input){ Node temp = head; while (temp != null){ if ((temp.data == key)&&(temp == head)) { this.addFirst(input); System.out.println("Insert data is succeed."); break; } else if (temp.pointer.data == key) { input.pointer = temp.pointer; temp.pointer = input; System.out.println("Insert data is succeed."); break; } temp = temp.pointer; } } //program menggunakan java

Page 28: Linked List

(5) Penghapusan

Dibedakan menjadi :

1. Hapus node depan

2. Hapus node belakang

3. Hapus node tertentu

Page 29: Linked List

Hapus Node Depan

void removeFirst(){ Node temp = head; if (!isEmpty()){ if (head == tail) head = tail = null; else { temp = temp.pointer; head = temp; temp = null; } size--; } else System.out.println("Data is empty!"); } //program menggunakan java

Page 30: Linked List

Hapus Node Belakang

void removeLast(){ Node temp = head; if (!isEmpty()){ if (tail == head){ head = tail = null; } else { while (temp.pointer != tail){ temp = temp.pointer; } temp.pointer = null; tail = temp; temp = null; } size--; } else System.out.println("Data is empty!"); } //program menggunakan java

Page 31: Linked List

Hapus node tertentu void remove(Object key){ Node temp = head; if (!isEmpty()){ while (temp != null){ if (temp.pointer.data == key){ temp.pointer = temp.pointer.pointer; if(temp.pointer == null) tail=temp; break; } else if ((temp.data == key)&&(temp == head)){ this.removeFirst(); break; } temp = temp.pointer; } } else System.out.println("Data is empty!"); size--; } //program menggunakan java

Page 32: Linked List

Pengaksesan

• Digunakan untuk mencetak data seluruh node mulai dari yang paling depan sampai bertemu NULL.

public void print() { Node p = head.pointer; while (p != null) { System.out.println (p.data); p = p.pointer; } } //program menggunakan java

Page 33: Linked List

Double Linked List

Double Linked List adalah link list yang memiliki dua buah pointer yang menunjuk ke simpul sebelah kiri atau sebelumnya(Prev) dan yang menunjuk ke simpul sebelah kanan atau sesudahnya (Next).

Ada dua jenis Double Linked List :

1. Double Linked List Non Circular (DLLNC)

2. Double Linked List Circular (DLLC)

Page 34: Linked List

Harus Diperhatikan Pada Double

Linked List 1. Double Linked list memiliki pointer petunjuk yang selalu

menunjuk pada awal dari list yang disebut Head.

2. Double Linked list selalu memiliki pointer petunjuk yang 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 Linked list belum terhubung).

4. Posisi simpul terakhir pada Double Linked list selalu bernilai NIL karena ia tidak menunjuk pada simpul yang lainnya, kecuali bentuk circular .

Page 35: Linked List

Double Linked List Non Circular

(DLLNC)

• Setiap node/field pada linked list mempunyai field yang berisi data dan pointer. Node-node saling berkait melalui pointer.

• Untuk pembentukan node baru, mulanya pointer next dan

prev akan menunjuk ke nilai NIL.

• Pointer prev akan menunjuk ke node sebelumnya, dan pointer next akan menunjuk ke node selanjutnya.

Page 36: Linked List

Operasi Double Linked List

1. Menambah Simpul (Node)

2. Menghapus Simpul (Node)

3. Membaca Isi

Page 37: Linked List

(1) Penambahan

• Dibedakan menjadi :

1. Penambahan dari depan

2. Penambahan dari belakang

3. Penambahan dari tengah

Page 38: Linked List

Penambahan dari Depan Penambahan simpul di depan membutuhkan pointer

bantu (baru) untuk menambah simpul di awal linked list, kemudian dikaitkan dengan simpul awal. Simpul baru yang ditambahkan akan menjadi simpul pertama.

Page 39: Linked List

Dalam operasi ini juga perlu ditest apakah Awal masih

NIL atau tidak.

TAMBAH_DEPAN (var Awal, Akhir, Elemen); procedure TAMBAH_BELAKANG (var Awal, Akhir : Simpul ; Elemen : char ) ; var Baru : Simpul ; begin new (Baru) ; Baru^.Info :=Elemen; if Awal = nil then {* list masih kosong *} Akhir := Baru else Baru^.Berikut := Awal; Awal := Baru; end ; //program menggunakan java

Page 40: Linked List

Penambahan dari Belakang

Penambahan simpul di belakang membutuhkan pointer bantu untuk mengetahui data terbelakang, kemudian dikaitkan dengan data baru. Simpul baru yang ditambahkan menjadi simpul akhir.

Page 41: Linked List

Dalam operasi ini perlu ditest apakah linked list masih kosong atau tidak. Linked list yang masih kosong ditandai dengan nilai pointer Awal yang nilainya sama dengan NIL.

TAMBAH_BELAKANG (var Awal, Akhir, Elemen); procedure TAMBAH_BELAKANG (var Awal, Akhir : Simpul ; Elemen : char ) ; var Baru : Simpul ; begin new (Baru) ; Baru^.Info :=Elemen; if Awal = nil then {* list masih kosong *} Awal := Baru else Akhir^.Berikut := Baru; Akhir := Baru; Akhir^.Berikut := nil end ; //program menggunakan java

Page 42: Linked List

Penambahan dari Tengah

Penambahan simpul di tengah membutuhkan pointer

bantu (baru) untuk diletakkan setelah simpul yang ditunjuk oleh pointer Bantu.

Page 43: Linked List
Page 44: Linked List

TAMBAH_TENGAH (var Awal, Akhir, Elemen); procedure TAMBAH_TENGAH (var Awal, Akhir : Simpul ; Elemen :

char ) ; var Baru, Bantu : Simpul ; begin new (Baru) ; Baru^.Info :=Elemen; if Awal = nil then begin Awal := Baru; Akhir := Baru; end; else begin {* Mencari lokasi yang sesuai *} Bantu := Awal; while Elemen > Baru^.Berikut^.Info do Bantu := Bantu^.Berikut; {* Menyisipkan simpul baru *} Baru^.Berikut := Bantu^.Berikut; Bantu^.Berikut := Baru; end; end ; //program menggunakan java

Page 45: Linked List

(2) Penghapusan

Dibedakan menjadi :

1. Hapus node depan

2. Hapus node belakang

3. Hapus node tertentu

Page 46: Linked List

Hapus Node Depan

Page 47: Linked List

Hapus Node Belakang

Page 48: Linked List

Hapus node tengah Penghapusan simpul di tengah membutuhkan pointer

bantu pada simpul sebelum simpul yang akan dihapus dan pointer lainnya (Hapus) pada simpul yang akan dihapus.

Page 49: Linked List
Page 50: Linked List

procedure HAPUS_SIMPUL (var Awal, Akhir ; Simpul; Elemen : char); var Bantu, Hapus : Simpul; begin if awal <> nil then {*list masih kosong*} Writeln (‘list masih kosong’) else if Awal^.Info=Elemen then {* simpul pertama dihapus) Begin Hapus := Awal; Awal := Hapus^.Berikut; dispose(Hapus) end else {*menghapus simpul tengah atau terakhir*} begin Bantu := Awal; {*mencari simpul yang akan dihapus*} while (Elemen <> Bantu^.Info) and (Bantu^.Berikut <> nil) do Bantu := Bantu^.Berikut; Hapus := Bantu^.Berikut; //program menggunakan java

Page 51: Linked List

if Hapus <> nil then {*simpul yang akan dihapus ketemu*} begin if Hapus <> Akhir then {*simpul tengah dihapus*} Bantu^.Berikut := Hapus^.Berikut else {*simpul terakhir dihapus*} begin Akhir := Bantu; Akhir^.Berikut :=nil end; dispose(Hapus) end else {*simpul yang akan dihapus tidak ketemu*} writeln(‘simpul yang akan dihapus tidak ada*) end end; //program menggunakan java

Page 52: Linked List

(2) Membaca Isi

• Dibedakan menjadi :

1. Membaca Maju

2. Membaca Mundur

Page 53: Linked List

Membaca Maju

Membaca maju artinya membaca isi linked list mulai

posisi Head sampai ke posisi Tail, dari simpul paling kiri

sampai simpul paling kanan.

Pertama kali kita atur agar pointer Bantu menunjuk ke

simpul yang ditunjuk oleh pointer Awal. Setelah isi

simpul itu dibaca, maka pointer Bantu kita gerakkan ke

kanan untuk membaca simpul berikutnya. Proses ini kita

ulang sampai pointer Bantu sama dengan pointer Akhir.

Page 54: Linked List

Procedure Baca_Maju (Awal, Akhir : Simpul); var Bantu : Simpul; begin Bantu := Awal; repeat write (Bantu^.Info:’ ’); Bantu := Bantu^.Berikut until Bantu = nil; writeln; end; //program menggunakan java

Page 55: Linked List

Membaca Mundur

Membaca mundur artinya membaca isi dari linked list

mulai posisi Tail sampai ke posisi Head, membaca dari

kanan ke kiri. Pertama, mengatur pointer Bantu sama

dengan pointer Awal. Berikutnya, pointer Awal

diarahkan ke simpul Akhir dan kita pakai pointer lain,

misalkan Bantu1 untuk bergerak dari simpul pertama

sampai simpul sebelum simpul terakhir. Langkah

selanjutnya adalah mengarahkan medan pointer dari

simpul terakhir ke simpul Bantu1. Langkah ini diulang

sampai pointer Akhir berimpit dengan pointer Bantu.

Page 56: Linked List

Procedure Baca_Mundur (Bantu : Simpul); begin If Bantu <> nil then begin Mundur (Bantu^.Berikut); write (Bantu^.Info: ‘ ‘) end; end; //program menggunakan java

Page 57: Linked List

Circular Linked List

Circular Linked List adalah link list terletak paling akhir, pointernya menuju ke head awalnya.

Ada dua jenis Circular Linked List :

1. Single Linked List Circular

2. Double Linked List Circular

Page 58: Linked List

Single Linked List Circular(SLLC)

Single Linked List Circular yaitu dimana link listed yang pointer nextnya menunjuk pada dirinya sendiri.

Jika Single Linked List tersebut terdiri dari beberapa node, maka pointer next pada node terakhir akan menunjuk ke node paling awalnya.

Page 59: Linked List

Double Linked List Circular(DLLC)

Jenis linked list ini merupakan jenis double linked list yang memiliki simpul kepala dan tidak mempunyai tail (Head = Tail).

Fungsi simpul kepala dapat digunakan untuk menyimpan informasi tambahan pada list.

Page 60: Linked List

TERIMA KASIH