Nama : Arum Mahartika (1135010026) Linked List Pengertian Linked List adalah salah satu bentuk struktur data, berisi kumpulan data (node) yang tersusun secara sambung menyambung, dinamis dan terbatas. Linked List sering disebut juga Senarai Berantai Linked List saling terhubung dengan bantuan variabel pointer Masing-masing data dalam Linked List disebut dengan node (simpul) yang menempati alokasi memori secara dinamis dan biasanya berupa struct yang terdiri dari beberapa field. Gambar tersebut menunjukkan Linked List tunggal atau ’singly-linked list’ dimana tiap simpul hanya memiliki satu taut (link) yang merujuk ke simpul berikutnya atau nilai null pada akhir simpul. Seranai berantai ini hanya bisa diakses maju dari awal simpul ke akhir simpul. Operasi-Operasi yang ada pada Linked List Insert Istilah Insert berarti menambahkan sebuah simpul baru ke dalam suatu linked list. IsEmpty Fungsi ini menentukan apakah linked list kosong atau tidak. Find First Fungsi ini mencari elemen pertama dari linked list Find Next Fungsi ini mencari elemen sesudah elemen yang ditunjuk now Retrieve Fungsi ini mengambil elemen yang ditunjuk oleh now. Elemen tersebut lalu dikembalikan oleh fungsi. Update Fungsi ini mengubah elemen yang ditunjuk oleh now dengan isi dari sesuatu Delete Now Fungsi ini menghapus elemen yang ditunjuk oleh now. Jika yang dihapus adalah elemen pertama dari linked list (head), head akan berpindah ke elemen berikut. Delete Head Fungsi ini menghapus elemen yang ditunjuk head. Head berpindah ke elemen sesudahnya. Clear Fungsi ini menghapus linked list yang sudah ada. Fungsi ini wajib dilakukan bila anda ingin mengakhiri program yang menggunakan linked list. Jika anda melakukannya, data-data yang dialokasikan ke memori pada program sebelumnya akan tetap tertinggal di dalam memori. Operasi-operasi untuk Stack dengan Linked List IsEmpty Fungsi memeriksa apakah stack yang adamasih kosong. Push Fungsi memasukkan elemen baru ke dalam stack. Push di sini mirip dengan insert dalam single linked list biasa. Pop Fungsi ini mengeluarkan elemen teratas dari stack. Clear Fungsi ini akan menghapus stack yang ada. Operasi-operasi Queue dengan Double Linked List IsEmpty Fungsi IsEmpty berguna untuk mengecek apakah queue masih kosong atau sudah berisi data. Hal ini dilakukan dengan mengecek apakah head masih menunjukkan pada Null atau tidak. Jika benar berarti queue masih kosong. IsFull Fungsi IsFull berguna untuk mengecek apakah queue sudah penuh atau masih bisa menampung data dengan cara mengecek apakah Jumlah Queue sudah sama dengan MAX_QUEUE atau belum. Jika benar maka queue sudah penuh. EnQueue Fungsi EnQueue berguna untuk memasukkan sebuah elemen ke dalam queue (head dan tail mula-mula meunjukkan ke NULL). DeQueue Procedure DeQueue berguna untuk mengambil sebuah elemen dari queue. Hal ini dilakukan dengan cara menghapus satu simpul yang terletak paling depan (head). Single Linked List Circular Single Linked List Circular (SLLC) adalah Single Linked List yang pointer nextnya menunjuk pada dirinya sendiri. Jika Single Linked List tersebut terdiri dari beberapa node, maka pointer next pada node terakhir akan menunjuk ke node terdepannya. Pengertian: Node : rangkaian beberapa simpul Single : artinya field pointer-nya hanya satu buah saja dan satu arah. Linked List : artinya node-node tersebut saling terhubung satu sama lain. Circular : artinya pointer next-nya akan menunjuk pada dirinya sendiri sehingga berputar Ilustrasi SLLC Setiap node pada linked list mempunyai field yang berisi pointer ke node berikutnya, dan juga memiliki field yang berisi data. Pada akhir linked list, node terakhir akan menunjuk ke node terdepan sehingga linked list tersebut berputar. Deklarasi: Deklarasi node dibuat dari struct berikut ini: typedef struct TNode{ int data; TNode *next; }; Pembentukan node baru Digunakan keyword new yang berarti mempersiapkan sebuah node baru berserta alokasi memorinya. TNode *baru; baru = new TNode; baru->data = databaru; baru->next = baru; Dibutuhkan satu buah variabel pointer: head Head akan selalu menunjuk pada node pertama Penambahan data di depan Penambahan node baru akan dikaitan di node paling depan, namun pada saat pertama kali (data masih kosong), maka penambahan data dilakukan pada head nya. Pada prinsipnya adalah mengkaitkan data baru dengan head, kemudian head akan menunjuk pada data baru tersebut sehingga head akan tetap selalu menjadi data terdepan. Untuk menghubungkan node terakhir dengan node terdepan dibutuhkan pointer bantu. HEAD Single Linked List Circular Penambahan data di depan Penambahan data di belakang Penambahan data dilakukan di belakang, namun pada saat pertama kali data langsung ditunjuk pada head-nya. Penambahan di belakang lebih sulit karena kita membutuhkan pointer bantu untuk mengetahui data terbelakang, kemudian dikaitkan dengan data baru. Untuk mengetahui data terbelakang perlu digunakan perulangan. Operasi Penghapusan Penghapusan node dilakukan dengan memutus rantai node kemudian menghapus node. Jika node berada di tengah rangkaian, rangkaian yang terputus perlu disambung kembali. Untuk memudahkan penghapusan simpul dibutuhkan dua cursor sebagai simpul bantu. Selain cursor juga dibutuhkan simpul head sebagai acuan awal simpul dalam rangkaian. Berikut langkah langkah untuk menghapus simpul dalam rangkaian: Buat cursor bantu yang menunjuk ke awal node(simpul). Pindahkan cursor ke node berikutnya Putus sambungan awal node dengan node berikutnya. Hapus rangkaian Jika berada di akhir rangkaian, putuskan dari rangkaian sebelumnya Jika di tengah rangkaian, pindahkan penunjukan node berikutnya, atau di akhir, atau setelah node yang akan dihapus Ilustrasi Hapus Depan Ilustrasi Hapus Belakang Contoh Source Code : import java.util.List; import java.util.LinkedList; import java.util.Iterator; import java.util.ListIterator; import java.util.Collections; import java.util.Random; public class LinkedListExample { public static void main(String[] args) { // LinkedList Creation List linkedListA = new LinkedList(); List linkedListB = new LinkedList(); // Adding elements to the LinkedList for (int i = 0; i < 5; i++) { linkedListA.add(new Integer(i)); } linkedListB.add(“beginner”); linkedListB.add(“java”); linkedListB.add(“tutorial”); linkedListB.add(“.”); linkedListB.add(“com”); linkedListB.add(“java”); linkedListB.add(“site”); // Iterating through the LinkedList to display the Contents. Iterator i1 = linkedListA.iterator(); System.out.print(“LinkedList linkedListA –> “); while (i1.hasNext()) { System.out.print(i1.next() + ” , “); } System.out.println(“——”); Iterator i2 = linkedListB.iterator(); System.out.println(“LinkedList linkedListB –> “); while (i2.hasNext()) { System.out.print(i2.next() + ” , “); } System.out.println(); System.out.println(); System.out.println(“Using ListIterator to retrieve LinkedList Elements”); System.out.println(); ListIterator li1 = linkedListA.listIterator(); // next(), hasPrevious(), hasNext(), hasNext() nextIndex() can be used with a // ListIterator interface implementation System.out.println(“LinkedList linkedListA –> “); while (li1.hasNext()) { System.out.print(li1.next() + ” , “); } System.out.println(); // Searching for an element in the LinkedList int index = linkedListB.indexOf(“java”); System.out.println(“‘java’ was found at : ” + index); int lastIndex = linkedListB.lastIndexOf(“java”); System.out.println(“‘java’ was found at : ” + lastIndex + ” from the last”); System.out.println(); // Getting the subList from the original List List subList = linkedListA.subList(3, linkedListA.size()); System.out.println(“New Sub-List(linkedListA) from index 3 to “ + linkedListA.size() + “: ” + subList); System.out.println(); // Sort an LinkedList System.out.print(“Sorted LinkedList linkedListA –> “); Collections.sort(linkedListA); System.out.print(linkedListA); System.out.println(); // Reversing an LinkedList System.out.print(“Reversed LinkedList linkedListA –> “); Collections.reverse(linkedListA); System.out.println(linkedListA); System.out.println(); // Checking emptyness of an LinkedList System.out.println(“Is linkedListA empty? “ + linkedListA.isEmpty()); System.out.println(); // Checking for Equality of LinkedLists LinkedList LinkedListC = new LinkedList(linkedListA); System.out.println(“linkedListA.equals(LinkedListC)? “ + linkedListA.equals(LinkedListC)); System.out.println(); // Shuffling the elements of an LinkedList in Random Order Collections.shuffle(linkedListA, new Random()); System.out.print(“LinkedList linkedListA after shuffling its elements–> “); i1 = linkedListA.iterator(); while (i1.hasNext()) { System.out.print(i1.next() + ” , “); } System.out.println(); System.out.println(); // Converting an LinkedList to an Array Object[] array = linkedListA.toArray(); for (int i = 0; i < array.length; i++) { System.out.println(“Array Element [" + i + "] = ” + array[i]); } System.out.println(); // Clearing LinkedList Elements linkedListA.clear(); System.out.println(“linkedListA after clearing : ” + linkedListA); System.out.println(); } } Sumber : http://dodi9802.wordpress.com/2012/01/25/serba-serbi-linkedlist-pada-java/ http://firgoblogerz.blogspot.com/2009/06/linked-list-versi-2.html