Anda di halaman 1dari 52

Algoritma dan Struktur Data

List Linear : Linked List (Single 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

Definisi
Linked list : struktur data yang dibangun dari satu atau lebih node yang menempati alokasi memori secara dinamis. Node : tempat penyimpanan data yang terdiri dari dua bagian/field. Field 1 adalah Data, digunakan untuk menyimpan data/nilai. Field 2 adalah Pointer, untuk menyimpan alamat tertentu.

Linked List
Jika linked list hanya berisi satu node maka pointernya akan menunjuk ke NULL. Jika linked list memiliki lebih dari satu node maka pointer menyimpan alamat dari node berikutnya. Sehingga antara node satu dengan node yang lain akan terhubung. Kecuali node paling ujung akan menunjuk ke NULL. Pointer disebut juga sebagai link.

Persamaan
Linked List
Struktur data yang terdiri atas sekumpulan data bertipe sama Memperhatikan urutan

Array
Struktur data yang terdiri atas sekumpulan data bertipe sama Memperhatikan urutan

Apa perbedaannya?

Array vs linked list


Banyaknya anggota
Banyaknya elemen array ditentukan di awal & jumlahnya tetap Elemen linked list dibuat di memori ketika dibutuhkan. Jumlahnya dinamis, dapat bertambah dan berkurang sesuai keperluan

Cara mengakses elemen


Elemen array diakses lewat indeks Untuk mengakses elemen linked list, harus dilakukan penelusuran elemen list

Array VS 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
Array representation

e
Linked list representation

Array VS Linked List


Mengizinkan operasi penambahan atau penghapusan 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 ditengahtengah array?

Linked List
Linked list dibedakan menjadi:
Single linked list Double linked list Circular linked list

Gambaran Struktur Node


Single linked-list null Double linked-list null

null

Link atau pointer


data

Single Linked List


Single : artinya pointer-nya hanya satu buah dan satu arah, yaitu menunjuk ke node sesudahnya. Node terakhir akan menunjuk ke NULL yang akan digunakan sebagai kondisi berhenti pada saat pembacaan isi linked list. ilustrasi single linked list yang memiliki 4 node :

13

Ilustrasi Single Linked List


Ilustrasi single linked list pada memory :

Ekor 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).

Ilustrasi Single Linked List


Ilustrasi single linked list pada memory :

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

Ilustrasi Single Linked List


Linked list yang memiliki 4 node, dimana node terakhir menunjuk ke NULL.
A0 A1 A2 A3

Kepala

Ekor

Single Representation
class Node { Object data; Node pointer; }
Ilustrasi : pointer data

Penjelasan: Pembuatan class bernama Node yang berisi 2 field/variabel, yaitu data bertipe Object dan pointer yang bertipe class Node. Field data : digunakan untuk menyimpan data/nilai pada linked list. Field pointer : digunakan untuk menyimpan alamat node berikutnya.

Pembentukan Obyek Node


Deklarasi atau pembentukan obyek Node menggunakan perintah new. Bentuknya adalah : new Node();

Contoh program
public class LinkedList1 { public static void main(String[] args) { Node head = new Node(); } }
Ilustrasi : pointer data

head

Pengaksesan Field pada Node


Untuk mengakses field dari node menggunakan object node kemudian diikuti dengan tanda . (titik) Contoh :
Mengakses data dari head perintahnya : head.data; Mengakses pointer dari head perintahnya : head.pointer;

Contoh program
public class LinkedList1 {
Ilustrasi :

public static void main(String[] args) { Node head = new Node(); System.out.println(data : " + head.data); System.out.println("pointer: " + head.pointer); } }
Output :

null null

head

Pengisian Data pada Field


Untuk mengisikan data pada field digunakan operator assigment (=). Contoh : memberikan data A pada head perintahnya adalah : head.data = A;

Contoh program
public class LinkedList1 {
Ilustrasi :

public static void main(String[] args) { Node head= new Node(); head.data = "A"; System.out.println(data : " + head.data); System.out.println("pointer: " + head.pointer); } }
Output :

null
A

head

Pointer Bantu
Head/First : Pointer yang menunjuk ke node paling depan. Tail/Last : Pointer yang menunjuk ke node paling belakang.

Pointer Head
Untuk mengingat node yg paling depan (node kepala) digunakan sebuah pointer yang akan menyimpan alamat dari node depan. Pointer ini biasanya diberi nama head.

head

head

Pointer Tail
Untuk mengingat node yg paling belakang (node ekor) digunakan sebuah pointer yang akan menyimpan alamat dari node belakang. Pointer ini biasanya diberi nama tail.

tail

tail

Contoh
Linked list yang memiliki 4 node :

A0

A1

A2

A3

head

tail

Operasi Linked List


1. 2. 3. 4. 5. 6. 7. 8. Inisialisasi isEmpty size Penambahan Penghapusan Penyisipan Pencarian Pengaksesan

(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; }

(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

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++; }

Ilustrasi : addFirst(x)
Node input

Menambahkan X pada lokasi paling depan. x


Kondisi awal pada linked list :

a head

Setelah penambahan node x didepan:

head

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++; }

Ilustrasi : addLast(x)
Node input

menambahkan X pada akhir list :


Kondisi awal pada linked list :

c tail

Setelah penambahan node x dibelakang :

d tail

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

Ilustrasi : Insert After(a)


a temp b c d

Menyisipkan X pada lokasi setelah temp.


a temp x x b c d

Sisip Setelah Elemen Tertentu

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; } }

Sisip Sebelum Elemen Tertentu

baru

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

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

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--; }

Linked Lists: menghapus elemen X


Proses menghapus dilakukan dengan mengabaikan elemen yang hendak dihapus dengan cara melewati pointer (reference) dari elemen tersebut langsung pada elemen selanjutnya. Elemen x dihapus dengan meng-assign field next pada elemen a dengan alamat b.

a temp a temp
Hasil akhir :

a
temp

Langkah-langkah menghapus elemen


a temp x b

Tidak ada elemen lain yang menyimpan alamat node x.


Node x tidak bisa diakses lagi. Java Garbage Collector akan membersihkan alokasi memory yang tidak dipakai lagi atau tidak bisa diakses. Dengan kata lain, menghapus node x.

Pengaksesan
Digunakan untuk mencetak data seluruh node mulai dari yang paling depan sampai ketemu NULL.
public void print() { Node p = head.pointer; while (p != null) { System.out.println (p.data); p = p.pointer; } }

Latihan Info dan Next


Link List / List Berkait p A 18 q 3 r 69 s 24

Contoh : Next (p) = q


Next(A) Next(Next(p)) Next(Next(Next(p))) Next (Next (r))

Info (r) = 69 Info(Next(A)) Info(Next(p)) Info(Next(Next(p))) Info (r)

Latihan
1. kondisi awal linked list:
100 200 300 400

2. Tambahkan node baru dengan data 500 dari belakang. Tambahkan node baru dengan data 50 dari depan. Tambahkan node dengan data 250 setelah node 200. 3. Hapus node depan. Selanjutnya hapus node belakang. Selanjutnya hapus node yg memiliki data 300. 4. Akses semua data dari seluruh node tersebut dari node yg paling depan ke belakang.

Anda mungkin juga menyukai