linked list

54
LINKED LIST

Upload: andra

Post on 04-Feb-2016

79 views

Category:

Documents


1 download

DESCRIPTION

LINKED LIST. History of Linked List. Dikembangkan tahun 1955-1956 oleh Allen Newell, Cliff Shaw dan Herbert Simon di RAND Corporation sebagai struktur data utama untuk bahasa Information Processing Language (IPL). - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: LINKED LIST

LINKED LIST

Page 2: LINKED LIST

History of Linked List• Dikembangkan tahun 1955-1956 oleh Allen

Newell, Cliff Shaw dan Herbert Simon di RAND Corporation sebagai struktur data utama untuk bahasa Information Processing Language (IPL). – IPL dibuat untuk mengembangkan program artificial

intelligence, seperti pembuatan Chess Solver.

• Victor Yngve di Massachusetts Institute of Technology (MIT) juga menggunakan linked list pada natural language processing dan machine transitions pada bahasa pemrograman COMMIT.

Page 3: 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.

Page 4: LINKED LIST

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.

Page 5: LINKED LIST

5

Array VS Linked List

Page 6: 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 7: LINKED LIST

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 ditengah-tengah array?

Page 8: LINKED LIST

Linked List

• Linked list dibedakan menjadi 2 :– Single linked list– Double 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

10

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 :

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

Ilustrasi Single Linked List

• Linked list yang memiliki 4 node, dimana node terakhir menunjuk ke NULL.

A0 A1 A2 A3

Kepala Ekor

Page 14: LINKED LIST

“Single” Representation

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.

class Node{ Object data; Node pointer;}

pointer

data

Ilustrasi :

Page 15: LINKED LIST

Pembentukan Obyek Node

• Deklarasi atau pembentukan obyek Node menggunakan perintah new.

• Bentuknya adalah :

new Node();

Page 16: LINKED LIST

Contoh program

public class LinkedList1 { public static void main(String[] args) { Node head = new Node(); }}

pointer

data

Ilustrasi :

head

Page 17: LINKED LIST

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;

Page 18: LINKED LIST

Contoh programpublic class LinkedList1 { 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

Ilustrasi :

head

Page 19: LINKED LIST

Pengisian Data pada Field

• Untuk mengisikan data pada field digunakan operator assigment (=).

• Contoh :

memberikan data “A” pada head perintahnya adalah : head.data = “A”;

Page 20: LINKED LIST

Contoh programpublic class LinkedList1 { 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

Ilustrasi :

head

Page 21: LINKED LIST

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

Page 22: LINKED LIST

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

Page 23: LINKED LIST

Contoh

• Linked list yang memiliki 4 node :

A0 A1 A2 A3

head tail

Page 24: LINKED LIST

Operasi Linked List

1. Inisialisasi

2. isEmpty

3. size

4. Penambahan

5. Penghapusan

6. Penyisipan

7. Pencarian

8. Pengaksesan

Page 25: LINKED LIST

Class Nodepublic class Node { Object data; Node pointer; Node() { } Node(Object data) { this.data = data; } Node(Object data, Node pointer) { this.data = data; this.pointer = pointer; }}

null

null

null

element

next

element

Constructor 1

Constructor 2

Constructor 3

Page 26: 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; }

Page 27: 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; }

Page 28: 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; }

Page 29: 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 30: 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++; }

Page 31: 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 32: 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++; }

Page 33: 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 34: 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); }}

Page 35: LINKED LIST

outputhead : nulltail : nullhead : asd.Node@42e816tail : asd.Node@42e816head : asd.Node@9304b1tail : asd.Node@42e816head : asd.Node@9304b1tail : asd.Node@190d11

Page 36: 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); }

Page 37: LINKED LIST

Ilustrasi : Insert After(a)

Menyisipkan X pada lokasi setelah temp.

a b c d

temp

a b

xtemp

c d x

Page 38: LINKED LIST

Penambahan sebelum Node tertentuvoid 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; } }

Page 39: LINKED LIST

(5) Penghapusan

• Dibedakan menjadi :

1. Hapus node depan

2. Hapus node belakang

3. Hapus node tertentu

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

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

Page 42: LINKED LIST

Hapus node tertentuvoid 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--; }

Page 43: LINKED LIST

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 b x

temp

a b

temp

a b x

temp

Hasil akhir :

Page 44: LINKED LIST

Langkah-langkah menghapus elemen

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

a b x

temp

Page 45: LINKED LIST

Pengaksesan

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

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

Page 46: LINKED LIST

Operasi Linked List dengan Index

1. Pengaksesan data node

2. Penambahan data

3. Penghapusan data

4. Pengaksesan index

Page 47: LINKED LIST

Method checkIndex(int index)

void checkIndex(int index) { if (index < 0 || index >= size) throw new IndexOutOfBoundsException ("index = " + index + " size = " + size); }

Page 48: LINKED LIST

Method get(int index)

public Object get(int index) { checkIndex(index); Node currentNode = head; for (int i = 0; i < index; i++) currentNode = currentNode.pointer; return currentNode.data; }

Page 49: LINKED LIST

Method indexOf(Object theElement)

public int indexOf(Object theElement) { // search the chain for theElement Node currentNode = head; int index = 0; // index of currentNode while (currentNode != null && !currentNode.data.equals(theElement)) { // move to next node currentNode = currentNode.pointer; index++; } // make sure we found matching element if (currentNode == null) return -1; else return index; }

Page 50: LINKED LIST

Method remove(int index)public Object remove(int index) { checkIndex(index); Object removedElement; if (index == 0) // remove first node { removedElement = head.data; head = head.pointer; } else { // use q to get to predecessor of desired node Node q = head; for (int i = 0; i < index - 1; i++) q = q.pointer; removedElement = q.pointer.data; q.pointer = q.pointer.pointer; // remove desired node tail=q; } size--; return removedElement; }

Page 51: LINKED LIST

Method add(int index,Object theElement)

public void add(int index, Object theElement) { if (index < 0 || index > size) // invalid list position throw new IndexOutOfBoundsException ("index = " + index + " size = " + size); if (index == 0) // insert at front head = new Node(theElement, head); else { // find predecessor of new element Node p = head; for (int i = 0; i < index - 1; i++) p = p.pointer; // insert after p p.pointer = new Node(theElement, p.pointer); } size++; }

Page 52: LINKED LIST

Latihan

1. Buatlah program dari 4 node berikut dengan kondisi awal linked list kosong:

• Tambahkan node baru dengan data 500 dari belakang. Tambahkan node baru dengan data 50 dari depan. Tambahkan node dengan data 250 setelah node 200.

• Hapus node depan. Selanjutnya hapus node belakang. Selanjutnya hapus node yg memiliki data 300.

• Akses semua data dari seluruh node tersebut dari node yg paling depan ke belakang.

100 200 300 400

Page 53: LINKED LIST

Latihan

2. Buatlah method untuk mengakses semua data pada single linked list.

3. Buatlah method untuk replace data pada single linked list. Gunakan pengaksesan index pada node.

Page 54: LINKED LIST

54

Sumber

• Arna Fariza, “Algoritma Struktur Data : Double Linked List”, PENS-ITS, Surabaya