T7 8-(List linier)Single Linked List

Download Report

Transcript T7 8-(List linier)Single Linked List

Pemrogramman Terstruktur
List Linear :
Linked List (Single Linkedlist)
Teknik Informatika
Universitas Muhammadiyah Malang
2011
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.
Array VS Linked List
6
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
c
a
e
Linked list representation
d
b
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 2 :
– Single linked list
– Double linked list
Gambaran Struktur Node
Single linked-list
Double linked-list
null
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 :
11
Ilustrasi Single Linked List
• Ilustrasi single linked list pada memory :
c
a
e
d
b
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 :
c
a
e
d
b
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
Kepala
A1
A2
A3
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 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
head
A1
A2
A3
tail
Operasi Linked List
1.
2.
3.
4.
5.
6.
7.
8.
Inisialisasi
isEmpty
size
Penambahan
Penghapusan
Penyisipan
Pencarian
Pengaksesan
Class Node
Constructor 1
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;
}
}
null
null
Constructor 2
null
element
Constructor 3
next
element
(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
b
c
d
head
Setelah penambahan node x didepan:
x
head
a
b
c
d
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 :
x
Kondisi awal pada linked list :
a
b
c
d
tail
Setelah penambahan node x dibelakang :
a
b
c
x
d
tail
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);
}
}
output
head : null
tail : null
head : Node@19821f
tail : Node@19821f
head : Node@addbf1
tail : Node@19821f
head : Node@addbf1
tail : Node@42e816
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
b
c
d
temp
 Menyisipkan X pada lokasi setelah temp.
a
x
temp
x
b
c
d
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;
}
}
(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
x
b
a
x
b
temp
temp
Hasil akhir :
a
temp
b
Langkah-langkah menghapus elemen
a
x
b
temp
•
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;
}
}
Operasi Linked List dengan Index
1.
2.
3.
4.
Pengaksesan data node
Penambahan data
Penghapusan data
Pengaksesan index
Method checkIndex(int index)
void checkIndex(int index)
{
if (index < 0 || index >= size)
throw new IndexOutOfBoundsException
("index = " + index + " size = " + size);
}
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;
}
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;
}
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;
}
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++;
}
Latihan
1. Buatlah program dari 4 node berikut dengan kondisi awal
linked list kosong:
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.
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.
Sumber
• Arna Fariza, “Algoritma Struktur Data : Double
Linked List”, PENS-ITS, Surabaya
55