Think Different materi ASD (UTS Semester Pendek) single linked list

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.

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


5

Array VS Linked List
• Menyimpan koleksi elemen secara noncontiguously.
– 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
ditengah-tengah array?

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

10


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)
{
null
Node head = new Node();
null
System.out.println(“data : " + head.data);
System.out.println("pointer: " + head.pointer);
}
}
head
Output :

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 :

}
Output :

public static void main(String[] args)
{
null
Node head= new Node();
A
head.data = "A";
System.out.println(“data : " + head.data);
System.out.println("pointer: " + head.pointer);
}
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;
int size=0;
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).
vo id a d d First(No d e inp ut){
if (isEmp ty()){
he a d =inp ut;
ta il=inp ut;
}
e lse
{
inp ut.p o inte r = he a d ;
he a d = inp ut;
} size ++;
}

Ilustrasi : addFirst(x)
 Menambahkan X pada lokasi paling depan. x

Node input

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).
vo id a d d La st(No d e inp ut){
if (isEmp ty()){
he a d = inp ut;
ta il = inp ut;
}
e lse
{
ta il.p o inte r = inp ut;
ta il = inp ut;
} 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 : asd.Node@42e816
tail : asd.Node@42e816
head : asd.Node@9304b1
tail : asd.Node@42e816
head : asd.Node@9304b1
tail : asd.Node@190d11

Penambahan setelah Node tertentu
• Dilakukan pencarian node yang memiliki data
yang sama dengan key.
vo id inse rtAfte r(O b je c t ke y,No d e inp ut){
No d e te mp = he a d ;
do {
if(te mp .d a ta ==ke y){
inp ut.p o inte r = te mp .p o inte r;
te mp .p o inte r = inp ut;
size ++;
Syste m.o ut.p rintln("Inse rt d a ta is suc c e e d .");
b re a k;
}
te mp = te mp .p o inte r;
}while (te mp !=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
vo id inse rtBe fo re (O b je c t ke y,No d e inp ut){
No d e te mp = he a d ;
while (te mp != null){
if ((te mp .d a ta == ke y)&&(te mp == he a d ))
{
this.a d d First(inp ut);
Syste m.o ut.p rintln("Inse rt d a ta is suc c e e d .");
b re a k;
}
e lse if (te mp .p o inte r.d a ta == ke y)
{ inp ut.p o inte r = te mp .p o inte r;
te mp .p o inte r = inp ut;
Syste m.o ut.p rintln("Inse rt d a ta is suc c e e d .");
b re a k;
}
te mp = te mp .p o inte r;
}
}

(5) Penghapusan
• Dibedakan menjadi :
1. Hapus node depan
2. Hapus node belakang
3. Hapus node tertentu

Hapus node depan
vo id re mo ve First(){
No d e te mp = he a d ;
if (!isEmp ty()){
if (he a d == ta il)
he a d = ta il = null;
e lse
{
te mp = te mp .p o inte r;
he a d = te mp ;
te mp = null;
} size --;
}
e lse
Syste m.o ut.p rintln("Da ta is e mp ty!");
}

Hapus node belakang
vo id re mo ve La st(){
No d e te mp = he a d ;
if (!isEmp ty()){
if (ta il == he a d ){
he a d = ta il = null;
}
e lse {
while (te mp .p o inte r != ta il){
te mp = te mp .p o inte r;
}
te mp .p o inte r = null;
ta il = te mp ;
te mp = null;
} size --;
}
e lse Syste m.o ut.p rintln("Da ta is e mp ty!");
}

Hapus node tertentu
vo id re mo ve (O b je c t ke y){
No d e te mp = he a d ;
if (!isEmp ty()){
while (te mp != null){
if (te mp .p o inte r.d a ta == ke y){
te mp .p o inte r = te mp .p o inte r.p o inte r;
if(te mp .p o inte r == null)
ta il=te mp ;
b re a k;
}
e lse if ((te mp .d a ta == ke y)&&(te mp == he a d )){
this.re mo ve First();
b re a k;
}
te mp = te mp .p o inte r;
}
}
e lse
Syste m.o ut.p rintln("Da ta is e mp ty!");
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 cetakLinkedlist()
{
Node p = head;
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

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.

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

54