2. Capaian Pembelajaran
● Mahasiswa memahami konsep linked list
● Mahasiswa memahami tahapan pembuatan linked list untuk menyelesaikan
masalah
3. Pengantar
● Konsep struktur data linked list mengatasi kelemahan dari struktur data array.
● Salah satu kekurangan ketika menggunakan data array sebagai penyimpanan data
adalah sifatnya yang statis.
● Array akan memesan sejumlah memori sesuai pada saat deklarasi, walaupun slot
memori tersebut belum terpakai untuk menyimpan data.
4. Definisi
● Linked list : struktur data linier yang dibangun dari satu atau
lebih node yang saling terhubung 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.
○ Pointer disebut juga sebagai link
5. Definisi Linked Lists
● 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 terakhir.
● Node terakhir pada linked list akan menunjuk null (nilai null merepresentasikan nilai
tidak ada/nothing/unset reference).
● Awal dari struktur Linked List terdapat head.
● Akhir dari struktur Linked List merupakan tail
Catatan: head bukanlah node yang terpisah, melainkan node yang menunjuk ke node
pertama. Begitu pula dengan tail
Jika Linked List kosong, maka head dan tail akan merujuk ke null.
7. Array VS Linked List
ARRAY LINKED LIST
Statis Dinamis
Penambahan/ Penghapusan data
terbatas
Penambahan/ Penghapusan data tidak
terbatas
Random Access Sequential access
Memiliki tipe data yang homogen Node terhubung melalui pointer ke
node berikutnya. Sehingga tidak harus
memiliki tipe data yang homogen
8. 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
9. 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?
10. Kelebihan & Kekurangan Linked
Lists
● Kelebihan: Struktur data yang dinamis, jumlah node dapat bertambah sesuai
kebutuhan data.
● Kekurangan: Struktur data ini tidak dapat mengakses data berdasarkan index. Jika
dibutuhkan pendekatan seperti ini, maka perlu dilakukan proses dari head dan
mengikuti penunjuk next sampai didapatkan data/index yang diinginkan.
11. Jenis-jenis Linked Lists
● Single Linked List: Memiliki penunjuk ke node berikutnya (next)
● Double Linked List: mempunyai dua penunjuk, yaitu next dan prev
● Circular linked list
13. Konsep Single Linked Lists
● Linked List merupakan struktur data dinamis.
● Jumlah node dapat bertambah sesuai dengan kebutuhan.
● Program yang tidak diketahui jumlah datanya, sebaiknya menggunakan struktur
data Linked List.
● Gambar berikut menunjukkan ilustrasi single linked lists.
14. Konsep Single Linked Lists
● Single :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.
● Linked List tidak menggunakan memory cell secara berderet (row). Tetapi, ia
memanfaatkan memory secara acak.
● Lalu bagaimana komputer mengetahui bahwa node itu merupakan satu linked lists
yang sama ?
○ Kuncinya adalah data yang disimpan ke dalam node, setiap node juga
menyimpan memory address untuk node berikutnya dalam satu linked list.
15. 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
16. 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
17. Contoh : “Single” Representation
Penjelasan:
● Pembuatan class bernama Node yang berisi 2 field/variabel, yaitu data bertipe
String 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
{
String data;
Node pointer;
}
pointer
data
Ilustrasi :
18. Implementasi Linked Lists (Node)
● Untuk merepresentasikan elemen data, diperlukan Node. Implementasi dalam
bahasa Java sebagai berikut:
● Terdapat dua atribut utama pada node yaitu data dan penunjuk next yang
menghubungkan dengan data berikutnya.
19. Implementasi Linked Lists (Node) Menggunakan
Tipe Data Generic
● Untuk penyimpanan tipe data yang lebih fleksibel, dapat menggunakan konsep
generic. Perhatikan contoh kode program berikut ini.
● Node bisa menerima berbagai tipe data: Integer, Float, String, Boolean
20. 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
21. 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
24. Operasi pada Linked Lists
● isEmpty: mengecek apakah head =
null (kosong).
● Print: menampilkan seluruh elemen
pada Linked Lists.
● Operasi penambahan node
○ Di awal
○ Di akhir
○ Setelah node tertentu
● Operasi menghapus node
○ Di awal
○ Di akhir
○ Di lokasi tertentu
● Operasi Linked List dengan Index
○ Pengaksesan data node
○ Pengaksesan index node
○ Penambahan data
○ Penghapusan data
25. Operasi isEmpty()
● Digunakan untuk mengetahui linked dalam kondisi kosong.
● Kondisi kosong : jika head=tail=null.
boolean isEmpty()
{
return head==null;
}
26. Proses Traverse pada Linked List
● Proses melakukan kunjungan pada setiap node tepat satu kali. Dengan melakukan
kunjungan secara lengkap, maka akan didapatkan urutan informasi secara linier
yang tersimpan dalam Linked List.
● Proses ini dilakukan pada operasi cetak data, penambahan data di akhir Linked Lists
dan pengaksesan Linked List menggunakan index
● Proses ini dimulai dari awal data (head) sampai menjumpai null. Proses ini tidak
merubah referensi dari head.
27. Operasi print()
● Untuk mencetak data seluruh node mulai dari yang paling depan(head) hingga tail
public void print() {
if (!isEmpty()) {
Node tmp = head;
while (tmp != null) {
System.out.print(tmp.data + "t");
tmp = tmp.next;
}
} else {
System.out.println("Linked list kosong");
}
}
28. Operasi Penambahan
● Penambahan dari depan (AddFirst)
● Penambahan di belakang (AddLast)
● Penambahan setelah key tertentu (InsertAfter)
29. Penambahan dari
Depan(addFirst)
● Jika kondisi awal node kosong maka head dan tail akan sama-sama menunjuk ke
node input.
● Jika pada linked list telah ada node, maka:
○ Next pada node input menunjuk node yang ditunjuk oleh head
○ Kemudian head akan menunjuk ke node input
1
2
1
2
30. 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
31. Operasi Linked Lists: AddFirst
void addFirst(Node input){
if (isEmpty()){
head=input;
tail=input;
}
else
{
input.next = head;
head = input;
}
}
32. Penambahan dari Belakang
(addLast)
● Operasi untuk menambah node di akhir elemen Linked Lists.
● Jika kondisi awal node kosong maka head dan tail akan sama-sama menunjuk ke
node input.
● Jika pada linked list telah ada node, maka:
○ Next pada node yang ditunjuk oleh tail menunjuk ke node input
○ kemudian tail akan menunjuk ke node input
33. 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 :
34. Operasi Linked Lists: addLast
void addLast(Node input){
if (isEmpty()){
head = input;
tail = input;
}
else
{
tail.pointer = input;
tail = input;
}
}
35. Penambahan setelah Node
tertentu(insertAfter)
● Dilakukan pencarian node yang memiliki data yang sama dengan key.
● Kemudian dilakukan penambahan node setelah node yang memiliki data sama
dengan key
● Contoh di bawah ini merupakan penambahan setelah key E : insertAfter(E)
key
36. a
Ilustrasi : Insert After(a)
● Kondisi Awal
Menyisipkan X pada lokasi setelah key.
a b c d
key
b
x
Key
c d
x
37. Operasi Linked Lists: insertAfter
public void insertAfter(Object key,Node input){
Node temp = head;
do{
if(temp.data==key){
input.next = temp. next;
temp. next = input;
System.out.println("Insert data is succeed.");
break;
}
temp = temp. next;
}while (temp!=null);
}
39. 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
key
a b
key
a b
x
key
Hasil akhir :
Kondisi awal :
40. 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
41. Operasi Linked Lists:
Remove/Delete
Ketika proses penghapusan perlu diperhatikan juga beberapa kondisi tambahan dari
data Linked Lists, yaitu:
● Linked List kosong, maka tidak dapat dilakukan penghapusan;
● Penghapusan node yang merupakan head, maka head harus menunjuk ke node
berikutnya;
● Node yang ingin dihapus harus ada dalam Linked List.
42. Hapus node depan
public void removeFirst(){
if(isEmpty()) System.out.println("Linked List masih Kosong!");
else if(head==tail){
head = tail = null;
}
else{
head = head.next;
}
}
43. Hapus node belakang
public void removeLast() {
if(isEmpty()) System.out.println("Linked List masih Kosong!");
else if(head==tail){
head = tail = null;
}
else{
Node current = head;
while(current.next != tail){
current = current.next;
}
current.next = null;
tail=current;
}
}
44. Hapus node tertentu
public void remove(int key){
if(isEmpty()) System.out.println("Linked List masih Kosong, tidak dapat dihapus!");
else{
Node temp = head;
while (temp != null){
if ((temp.data == key)&&(temp == head)){
this.removeFirst();
break;
}
else if (temp.next.data == key){
temp.next = temp.next.next;
if(temp.next == null)
tail=temp;
break;
}
temp = temp.next;
}
}
}
45. Operasi Linked List dengan Index
● Pengaksesan data node
● Pengaksesan index node
● Penambahan data
● Penghapusan data
46. Pengaksesan data node:
getData(int index)
public int getData(int index)
{
Node tmp = head;
for (int i = 0; i < index; i++)
tmp = tmp.next;
return tmp.data;
}
47. Operasi pencarian indeks data pada node :
indexOf(key)
public int indexOf(int key) {
Node tmp = head;
int index = 0;
while (tmp != null && tmp.data != key) {
tmp = tmp.next;
index++;
}
if (tmp == null) {
return -1;
} else {
return index;
}
}
48. Method remove(int index)
public void removeAt(int index) {
if (index == 0) {
removeFirst();
} else {
Node temp = head;
for (int i = 0; i < index - 1; i++) {
temp = temp.next;
}
temp.next = temp.next.next;
if (temp.next == null) {
tail = temp;
}
}
}
49. Method add(int index,Object theElement)
public void insertAt(int index, int input) {
if (index < 0) {
System.out.println("indeks salah");
} else if (index == 0)
{
addFirst(input);
} else {
Node temp = head;
for (int i = 0; i < index - 1; i++) {
temp = temp.next;
}
temp.next = new Node(input, temp.next);
}
}
50. Latihan
Jelaskan Langkah-langkah dari 4 node berikut dengan kondisi awal linked list kosong:
1. Tambahkan node baru dengan data 500 dari belakang.
2. Tambahkan node baru dengan data 50 dari depan.
3. Tambahkan node dengan data 250 setelah node 200.
4. Tambahkan node dengan data 150 pada indeks ke-1
5. Hapus node depan
6. hapus node belakang
7. hapus node yg memiliki data 300.
8. Hapus node pada indeks ke-3
*Tampilkan semua data dari seluruh node pada linked list untuk setiap
penambahan/penghapusan
100 200 300 400