Dokumen tersebut membahas tentang struktur data linked list. Terdapat penjelasan tentang konsep dasar linked list, cara kerja, dan implementasinya dalam bahasa pemrograman termasuk penambahan, penghapusan, dan penyisipan node. Juga dibahas metode-metode yang dapat dilakukan pada linked list seperti pengecekan kondisi kosong, pengaksesan ukuran dan data, serta operasi-operasi lainnya.
1. Nama kelompok
1) Victor Sitio : 113209086
2) Mei Gom-Gom :113209048
3) Nita Setiawati :113209054
4) Windy Aryane :113209093
5) Rahmat safei : 113209098
6) Dwi Susanto : 113209022
MANAGEMENT INFORMATIKA
D3
KELAS SORE
2. List Linear :
Linked List (Single Linkedlist)
Management Informatika
Politeknik Perdana Mandiri
2012-2013
Pemrogramman
Terstruktur
3. Mahasiswa mampu :
Memahami struktur data linked list
Memahami cara pengoperasian struktur data linked list
Mengimplementasikan struktur data linked list
4. Bentuk dasar linked list
deklarasi class linked list
Tambah node
Hapus node
Penyisipan node
ADT Linked List
5. 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.
6. 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.
8. 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. 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?
12. 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 :
12
13. 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
14. 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
15. Linked list yang memiliki 4 node, dimana node
terakhir menunjuk ke NULL.
A0 A1 A2 A3
Kepala Ekor
16. 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.
class Node
{
Object data;
Node pointer;
}
pointer
data
Ilustrasi :
18. public class LinkedList1 {
public static void main(String[] args)
{
Node head = new Node();
}
}
pointer
data
Ilustrasi :
head
19. 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;
20. public class LinkedList1 {
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
Ilustrasi :
head
21. Untuk mengisikan data pada field digunakan operator
assigment (=).
Contoh :
memberikan data “A” pada head perintahnya adalah :
head.data = “A”;
22. public class LinkedList1 {
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
Ilustrasi :
head
23. 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
24. 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
27. 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
null
element
next
element
Constructor 1
Constructor 2
Constructor 3
28. 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;
}
29. Digunakan untuk mengetahui linked dalam kondisi
kosong.
Kondisi kosong : jika size = 0 atau jika head=tail=null.
boolean isEmpty()
{
return size==0;
}
30. 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;
}
31. Dibedakan menjadi :
1. Penambahan dari depan
2. Penambahan dari belakang
3. Penambahan setelah node tertentu
4. Penambahan sebelum node tertentu
32. 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++;
}
33. Menambahkan X pada lokasi paling depan.
a b c d
head
x b
head
c da
x
Kondisi awal pada linked list :
Setelah penambahan node x didepan:
Node input
34. 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++;
}
35. 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 :
37. head : null
tail : null
head : Node@19821f
tail : Node@19821f
head : Node@addbf1
tail : Node@19821f
head : Node@addbf1
tail : Node@42e816
38. 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);
}
39. Menyisipkan X pada lokasi setelah temp.
a b c d
temp
a b
xtemp
c dx
40. 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;
}
}
42. 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!");
}
43. 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!");
}
44. 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--;
}
45. 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 bx
temp
a b
temp
a bx
temp
Hasil akhir :
46. 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 bx
temp
47. 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;
}
}
48. 1. Pengaksesan data node
2. Penambahan data
3. Penghapusan data
4. Pengaksesan index
49. void checkIndex(int index)
{
if (index < 0 || index >= size)
throw new IndexOutOfBoundsException
("index = " + index + " size = " + size);
}
50. public Object get(int index)
{
checkIndex(index);
Node currentNode = head;
for (int i = 0; i < index; i++)
currentNode = currentNode.pointer;
return currentNode.data;
}
51. 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;
}
52. 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;
}
53. 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++;
}