ASD Single Linked List
ASD Single Linked List
Linked List
1
Outline
2
Tujuan
3
Linked List
• Linked List
A0 A1 A2 A3
• Struktur data yang dibangun dari satu atau lebih
Node/ListNode yang menempati alokasi memori secara
dinamis
• Node
• Dalam linked list: tempat penyimpanan data yang terdiri
dari dua bagian/field
• Field pertama adalah Element/Data: digunakan untuk
menyimpan data/nilai
• Field kedua adalah Pointer/Reference: digunakan untuk
menyimpan referensi ke Node berikutnya
4
Linked List
• Jika Linked List hanya berisi satu node
• maka pointer-nya 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.
5
Linked List vs Array
• Linked List
A0 A1 A2 A3
• Menyimpan koleksi elemen secara non-contiguously
Letak elemen satu dengan yang lain di dalam memori bisa berjauhan (acak).
Berbeda dengan elemen dalam array yang terletak berurutan dalam memori.
a b c d e
Representasi Array
c a e d b
Representasi Linked List
6
Linked List vs Array
• Items are stored in contiguous array:
//step through array a, outputting each item
for (int idx=0; index < sizeof(a)/sizeof(a[0]); idx++)
cout << a[index] << endl;
First/Head Last/Tail7
Linked List vs Array
• Mengizinkan operasi tambah dan hapus elemen di tengah
koleksi
• Hanya membutuhkan jumlah perpindahan elemen yang
konstan
• Berbeda dengan array. Apabila ada elemen baru disisipkan di tengah-
tengah, berapa elemen yang harus dipindahkan?
A0 A1 A0 A1
A2 A2
elemen baru elemen baru
8
Singly (Single) Linked List
• Singly (Single) Linked List
• 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 :
A B C D NULL
9
Singly (Single) Linked List
• Ilustrasi singly linked list pada memori:
C A E D B
Head
• Node A
• Node A tidak ditunjuk oleh node manapun maka node ini
adalah node yang paling depan (node kepala).
10
Singly (Single) Linked List
• Ilustrasi singly linked list pada memori:
C A E D B
• Node E 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).
11
Implementasi: Linked List
• Sebuah list merupakan rantai dari object bertipe
ListNode yang berisikan data dan referensi
(pointer) kepada ListNode selanjutnya dalam list.
• Harus diketahui di mana letak elemen pertama!
ListNode
A0 A1 A2 A3
First/Head Last/Tail
12
ListNode: Definisi
struct ListNode{
int data;
ListNode *next;
};
atau
Penjelasan:
class ListNode{
Pembuatan class bernama ListNode yang
int data; berisi 2 field/variabel, yaitu data bertipe
ListNode *next; Object dan next yang bertipe class
ListNode.
}; Field element: digunakan untuk
menyimpan data/nilai pada linked list.
Field next: digunakan untuk menyimpan
alamat node berikutnya.
13
Catatan
14
Pembentukan Obyek ListNode
15
ListNode Head/First
Head/First Head/First
16
Contoh Program ListNode Head
int main() { Ilustrasi
ListNode *head = new ListNode;
} pointer
data
Tail/Last Tail/Last
18
Operasi-Operasi pada Linked List
1. Inisialisasi
2. isEmpty()
3. size()
4. add()/append() (Penambahan)
5. insert() (Penyisipan)
6. remove() (Penghapusan)
7. Pengaksesan
8. Pencarian
19
1. Inisialisasi
• Proses ini digunakan untuk mendeklarasi sekaligus
memberikan nilai awal (inisialisasi) pada pointer
head dan tail → biasanya ditaruh di constructor.
• Nilai awal kedua pointer tersebut adalah NULL.
Yang menandakan bahwa linked list dalam kondisi
kosong (belum ada node yang terbentuk).
ListNode *head, *tail;
bool is_empty()
{
return size==0; //atau return head = NULL;
}
21
3. size()
• Digunakan untuk mengetahui banyak node pada
linked list.
• Size bertambah 1 setiap ada node baru yang
ditambahkan pada linked list.
• Size berkurang 1 setiap ada penghapusan node.
int size()
{
return size;
}
22
4. Penambahan: add_first(x)
current
current
23
4. Penambahan: add_last(x)
• Kondisi awal pada linked list
A B C D
tail
• Menyisipkan X pada lokasi setelah tail
A B C D X
tail tail
24
4. Penambahan: add_last(x)
• Menyisipkan X pada lokasi setelah tail
// tail menyatakan node terakhir dalam linked list
tail.next = new ListNode;
tail = tail->next; // adjust tail
tail->element = x; // place x in the node
tail->next = null; // adjust next
A B C D X
tail tail
• bisa lebih singkat bila menggunakan constructor:
tail = tail->next = new ListNode (x, null);
25
5. Penyisipan: insert()
• Kondisi awal pada linked list
A B C D
current
• Menyisipkan X pada lokasi setelah current
A X B C D
X
current
26
5. Langkah-Langkah Menyisipkan
A B
X
current tmp
27
5. Langkah-langkah
menyisipkan yang lebih efisien
tmp = new ListNode (x, current->next);
A B
X
current
current->next = tmp;
A B
X
current
28
6. Penghapusan: remove()
• 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
current
A B
current
29
6. Langkah-langkah menghapus
elemen
• Butuh menyimpan alamat node yang terletak
sebelum node yang akan dihapus. (pada gambar
node current, berisi elemen a)
current->next = current->next->next;
A x B
current
30
6. Langkah-langkah menghapus
elemen
A x B
current
• Tidak ada elemen lain yang menyimpan alamat
node x.
• Node x tidak bisa diakses lagi.
• Karena C++ tidak mengenal garbage collector maka
node x dihapus dengan dealokasi memori
delete x; atau free(x);
tergantung metode alokasi memori node
31
7. Pengaksesan
• Digunakan untuk mencetak data seluruh node
mulai dari yang paling depan sampai ketemu NULL.
void print()
{
ListNode *p = head; //bila menggunakan header, maka p=header->next
while (p != null) {
cout << p->element << " ";
p = p->next;
}
}
void print()
{
for (ListNode *p = head; p != NULL; p = p->next)
cout << p->data << " ";
}
32
Pertanyaan
33
Header Node
• Menghapus dan menambahkan elemen pertama menjadi
kasus khusus.
• Dapat dihindari dengan menggunakan header node;
• Tidak berisikan data, digunakan untuk menjamin bahwa selalu ada
elemen sebelum elemen pertama yang sebenarnya pada linked list.
• Elemen pertama diperoleh dengan: current = header->next;
• Empty list jika: header->next == null;
• Proses pencarian dan pembacaan mengabaikan header
node.
A B C
header
34
Latihan
• Buatlah sebuah method untuk menghitung jumlah
elemen dalam sebuah linked list!
int list_size (LinkedList the_list)
{
38
Latihan
1. Buatlah program dari 4 node berikut dengan
kondisi awal linked list kosong:
100 200 300 400
56
Latihan (Lanjt)
57