Upload
anthony-kwo
View
27
Download
0
Embed Size (px)
DESCRIPTION
Penjelasan mengenai Linked List
Citation preview
Linked List
Aciek Ida Wuryandari
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
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
Array VS Linked List
4
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
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?
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.
Linked List
• Linked list dibedakan menjadi 2 :
▫ Single linked list
▫ Double linked list
▫ Circular linked list
Gambaran Struktur Node
null
Link atau pointer
data
null
null
Single linked-list Double 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)
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
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
Operasi Linked List
1. Inisialisasi
2. isEmpty
3. Size
4. Penambahan
5. Penghapusan
6. Pengaksesan
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
(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
(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
(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
(4) Penambahan
Dibedakan menjadi :
1. Penambahan dari depan
2. Penambahan dari belakang
3. Penambahan setelah node tertentu
4. Penambahan sebelum node tertentu
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
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
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
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 :
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
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
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
Ilustrasi : Insert After(a)
Menyisipkan X pada lokasi setelah temp.
a b c d
temp
a b
x temp
c d x
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
(5) Penghapusan
Dibedakan menjadi :
1. Hapus node depan
2. Hapus node belakang
3. Hapus node tertentu
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
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
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
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
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)
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 .
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.
Operasi Double Linked List
1. Menambah Simpul (Node)
2. Menghapus Simpul (Node)
3. Membaca Isi
(1) Penambahan
• Dibedakan menjadi :
1. Penambahan dari depan
2. Penambahan dari belakang
3. Penambahan dari tengah
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.
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
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.
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
Penambahan dari Tengah
Penambahan simpul di tengah membutuhkan pointer
bantu (baru) untuk diletakkan setelah simpul yang ditunjuk oleh pointer Bantu.
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
(2) Penghapusan
Dibedakan menjadi :
1. Hapus node depan
2. Hapus node belakang
3. Hapus node tertentu
Hapus Node Depan
Hapus Node Belakang
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.
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
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
(2) Membaca Isi
• Dibedakan menjadi :
1. Membaca Maju
2. Membaca Mundur
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.
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
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.
Procedure Baca_Mundur (Bantu : Simpul); begin If Bantu <> nil then begin Mundur (Bantu^.Berikut); write (Bantu^.Info: ‘ ‘) end; end; //program menggunakan java
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
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.
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.
TERIMA KASIH