Post on 17-Sep-2015
description
Linked List(Runut Berantai)
Linked List Linked List adalah sebuah kumpulan nilai yang
terhubung
Linked List menggunkan node untuk menyimpan nilai tersebut
setiap node dihubungkan dengan sebuah pointer yang merujuk ke node berikut atau sebelum
node node
next
prevhead
next
prev
null
tail
next
prev
tail
Linked List (2)
prev merujuk ke node sebelum dan next ke node sesudahnya
Singly Linked List adalah list dimana setiap node HANYA memiliki next
Double Linked list adalah list dimana setiap node memiliki next dan prev
Linked List (3)
Head adalah node pertama dan tidak memiliki prev (prev == null)
Tail adalah node terakhir dan tidak memiliki next (next == null)
Linked List: Problem
Bagaimana mencari sebuah node dengan value tertentu?
Bagaimana mencari node dengan value terbesar?
Bagaimana menukar posisi 2 buah node?
Linked List: Implementasi
class Node{Node * next;Node *prev;int value;}
Linked List: Mencari Node dengan Nilai Tertentu
Node* findNode(Node head, int value){Node * curr = head;while (curr != null){if (curr->value == value){return curr;}curr = curr->next; }return null;}
Linked List: Mencari Node dengan Nilai Tertentu
Node* findNode(Node head, int value){Node * curr = head;while (curr != null){if (curr->value == value){return curr;}curr = curr->next; }return null;}
mulai dari head
Linked List: Mencari Node dengan Nilai Tertentu
Node* findNode(Node head, int value){Node * curr = head;while (curr != null){if (curr->value == value){return curr;}curr = curr->next; }return null;}
jika curr tidak kosong, belum selesai
Linked List: Mencari Node dengan Nilai Tertentu
Node* findNode(Node head, int value){Node * curr = head;while (curr != null){if (curr->value == value){return curr;}curr = curr->next; }return null;}
badingkan nilai curr dengan nilai yang dicari
jika sesuai, kembalikan
jika tidak, masuk ke node berikutnya
Linked List: Mencari Node dengan Nilai Tertentu
Node* findNode(Node head, int value){Node * curr = head;while (curr != null){if (curr->value == value){return curr;}curr = curr->next; }return null;} jika kita sudah melewati tail,
dan nilai belum ditemukan kembalikan null
Linked List: Membalikkan 2 Node bersebelahan
node1 node2
next
prevhead
next
prev
null
tail
next
prev
tail
node2 node1
next
prevhead
next
prev
null
tail
next
prev
tail
Linked List: Membalikkan 2 Node bersebelahan
Masalah: prev dan next dari node1 dan node2 sudah berubah
Pre: prev dari node1 adalah head, next adalah node2; prev dari node2 adalah node1, next adalah tail
Post: prev dari node1 adalah node2, next adalah tail, prev dari node2 adalah head, next adalah node1
Linked List: Membalikkan 2 Node bersebelahan
Node* switchNode(Node * first, Node * second){Node * firstPrev = first->prev;first->prev = second;
Node * secondNext = second->next;second->next = first;
first->next = secondNext;second->prev = firstPrev;}
Linked List: Membalikkan 2 Node bersebelahan
Node* switchNode(Node * first, Node * second){Node * firstPrev = first->prev;first->prev = second;
Node * secondNext = second->next;second->next = first;
first->next = secondNext;second->prev = firstPrev;}
Simpan first->prev karena akan digunakan
oleh second->prev Ubah nilai first->prev
node1 node2
next
prevhead
next
prev
null
tail
next
prev
tail
Linked List: Membalikkan 2 Node bersebelahan
Node* switchNode(Node * first, Node * second){Node * firstPrev = first->prev;first->prev = second;
Node * secondNext = second->next;second->next = first;
first->next = secondNext;second->prev = firstPrev;}
Simpan second->next karena akan digunakan
oleh first->next Ubah nilai second->next
node1 node2
next
prevhead
next
prev
null
tail
prev
tail
next
Linked List: Membalikkan 2 Node bersebelahan
Node* switchNode(Node * first, Node * second){Node * firstPrev = first->prev;first->prev = second;
Node * secondNext = second->next;second->next = first;
first->next = secondNext;second->prev = firstPrev;} ubah yang lain dengan
menggunakan nilai yang telah disimpan
node2 node1
next
prevhead
next
prev
null
tail
next
prev
tail
DONE! :)
Q: Bagaimana mengubah 2 Node yang tidak bersebelahan?
Stack dan Queue
Linked List umum digunakan untuk mengimplementasikan barisan
Salah satu barisan yang umum adalah stack dan queue
Stack
Arti: Tumpukan
First In Last Out (FILO): element yang pertama masuk akan keluar paling terakhir
Implementasi: Call Stack; peyimpanan state pada saat pemanggilan function
A
B
C
D
poppush
Queue
Arti: Antrian
First In First Out (FILO): element yang pertama masuk akan keluar paling pertama
Implementasi: Request queue; antrian request yang masuk pada sebuah server A
B
C
pop
push