Algoritma & Struktur Data Linear List Teknik Informatika Universitas Muhammadiyah Malang SP - 2013 Representasi Linear List dengan Array dan Linked list Tujuan Instruksional • Mahasiswa mampu : – Memahami struktur data dari linear list – Mampu merepresentasikan linear list menggunakan array dan linked list – Mengimplementasikan linear list ke dalam program Struktur Data • Struktur data terdiri dari obyek data dan operasi-operasi. • Obyek data adalah sekumpulan instance (model/sampling) • Contoh obyek data : integer = {0, +1, -1, +2, -2, +3, -3, …} daysOfWeek = {S,M,T,W,Th,F,Sa} myDataObject = {apple, chair, 2, 5.2, red, green, Jack} Struktur Data • Struktur data dibedakan menjadi 2 jenis : 1. Linear list direpresentasikan dengan : array dan linked list 2. Struktur data hirarki Direpresentasikan dengan : tree dan graph Linear Lists • Disebut juga dengan ordered list. • Bentuk instance dari linear list : (e0, e1, e2, …, en-1) where ei denotes a list element n >= 0 is finite (list size is n) Linear Lists L = (e0, e1, e2, e3, …, en-1) relationships e0 is the zero’th (or front) element en-1 is the last element ei immediately precedes ei+1 Linear List Examples/Instances Students in COP3530 = (Jack, Jill, Abe, Henry, Mary, …, Judy) Exams in COP3530 = (exam1, exam2, exam3) Days of Week = (S, M, T, W, Th, F, Sa) Months = (Jan, Feb, Mar, Apr, …, Nov, Dec) Struktur data Operations • Operasi : aksi yang dapat dilakukan pada obyek data. • Operasi-operasi yang umum pada obyek data : penambahan elemen, penghapusan elemen, pengaksesan elemen, dll. Linear List Operations—size() determine list size L = (a,b,c,d,e) size = 5 Linear List Operations—get(theIndex) get element with given index L = (a,b,c,d,e) get(0) = a get(2) = c get(4) = e get(-1) = error get(9) = error Linear List Operations— indexOf(theElement) determine the index of an element L = (a,b,d,b,a) indexOf(d) = 2 indexOf(a) = 0 indexOf(z) = -1 Linear List Operations— remove(theIndex) remove and return element with given index L = (a,b,c,d,e,f,g) remove(2) returns c and L becomes (a,b,d,e,f,g) index of d,e,f, and g decrease by 1 Linear List Operations— remove(theIndex) remove and return element with given index L = (a,b,c,d,e,f,g) remove(-1) => error remove(20) => error Linear List Operations— add(theIndex, theElement) add an element so that the new element has a specified index L = (a,b,c,d,e,f,g) add(0,h) => L = (h,a,b,c,d,e,f,g) index of a,b,c,d,e,f, and g increase by 1 Linear List Operations— add(theIndex, theElement) L = (a,b,c,d,e,f,g) add(2,h) => L = (a,b,h,c,d,e,f,g) index of c,d,e,f, and g increase by 1 add(10,h) => error add(-6,h) => error Latihan Diketahui L=(a,b,c,d). L adalah sebuah array linier list. Tentukan hasil yang didapatkan ketika dilakukan perintah berikut ini : a) b) c) d) e) f) isEmpty() size() get(0), get(2),get(6),get(-3) indexOf(a), indexOf(c), indexOf(q) remove(0), remove(2), remove(3) add(0,e), add(2,f), add(3,g), add(4,h), add(6,h), add(-3,h) Data Structure Specification Language independent Abstract Data Type Java Interface Abstract Class Linear List Abstract Data Type AbstractDataType LinearList { instances ordered finite collections of zero or more elements operations isEmpty(): return true if the list is empty, false otherwise size(): return the list size (i.e., number of elements in the list) get(index): return the indexth element of the list indexO f(x): return the index of the first occurrence of x in the list, return -1 if x is not in the list remove(index): remove and return the indexth element, elements with higher index have their index reduced by 1 add(theIndex, x): insert x as the indexth element, elements with theIndex >= index have their index increased by 1 output(): output the list elements from left to right } Linear List as Java Interface An interface may include constants and abstract methods (i.e., methods for which no implementation is provided). Linear List as Java Interface public interface LinearList { public boolean isEmpty(); public int size(); public Object get(int index); public int indexOf(Object elem); public Object remove(int index); public void add(int index, Object obj); public String toString(); } Implementing An Interface public class ArrayLinearList implements LinearList { // code for all LinearList methods must be provided here } Linear List As An Abstract Class An abstract class may include constants, variables, abstract methods, and nonabstract methods. Linear List As Java Abstract Class public abstract class LinearListAsAbstractClass { public abstract boolean isEmpty(); public abstract int size(); public abstract Object get(int index); public abstract int indexOf(Object theElement); public abstract Object remove(int index); public abstract void add(int index, Object theElement); public abstract String toString(); } Extending A Java Class public class ArrayLinearList extends LinearListAsAbstractClass { // code for all abstract classes must come here } Linear List Array Representation use a one-dimensional array element[] a b c 0 1 2 d e 3 4 5 6 L = (a, b, c, d, e) Store element i of list in element[i]. Representation Used In Text a b c 0 1 2 d e 3 4 5 6 size = 5 put element i of list in element[i] use a variable size to record current number of elements Add/Remove An Element size = 5 a b c d e c d add(1,g) size = 6 a g b e Data Type Of Array element[] Data type of list elements is unknown. Define element[] to be of data type Object. Cannot put elements of primitive data types (int, float, double, char, etc.) into our linear lists. Increasing Array Length Length of array element[] is 6. a b c d e f First create a new and larger array newArray = new Object[15]; Increasing Array Length Now copy elements from old array to new one. a a b b c c d d e e f f Increasing Array Length Finally, rename new array. element = newArray; element[0] a b c d e f element.length = 15 Class ArrayLinearList • Merupakan hasil implements dari interface LinearList. Create An Empty List ArrayLinearList a = new ArrayLinearList(100), b = new ArrayLinearList(), c; LinearList d = new ArrayLinearList(1000), e = new ArrayLinearList(), f; Using A Linear List System.out.println(a.size()); a.add(0, new Integer(2)); b.add(0, new Integer(4)); System.out.println(a); b.remove(0); if (a.isEmpty()) a.add(0, new Integer(5)); Array Of Linear Lists LinearList [] x = new LinearList [4]; x[0] = new ArrayLinearList(20); x[1] = new Chain(); x[2] = new Chain(); x[3] = new ArrayLinearList(); for (int i = 0; i < 4; i++) x[i].add(0, new Integer(i)); The Class ArrayLinearList /** array implementation of LinearList */ package dataStructures; import java.util.*; // has Iterator interface import utilities.*; // has array resizing class public class ArrayLinearList implements LinearList { // data members protected Object [] element; // array of elements protected int size; // number of elements in array // constructors and other methods come here } A Constructor /** create a list with initial capacity initialCapacity * @throws IllegalArgumentException when * initialCapacity < 1 */ public ArrayLinearList(int initialCapacity) { if (initialCapacity < 1) throw new IllegalArgumentException ("initialCapacity must be >= 1"); // size has the default initial value of 0 element = new Object [initialCapacity]; } Another Constructor /** create a list with initial capacity 10 */ public ArrayLinearList() {// use default capacity of 10 this(10); } The Method isEmpty /** @return true iff list is empty */ public boolean isEmpty() {return size == 0;} The Method size() /** @return current number of elements in list */ public int size() {return size;} The Method checkIndex /** @throws IndexOutOfBoundsException when * index is not between 0 and size - 1 */ void checkIndex(int index) { if (index < 0 || index >= size) throw new IndexOutOfBoundsException ("index = " + index + " size = " + size); } The Method get /** @return element with specified index * @throws IndexOutOfBoundsException when * index is not between 0 and size - 1 */ public Object get(int index) { checkIndex(index); return element[index]; } The Method indexOf /** @return index of first occurrence of theElement, * return -1 if theElement not in list */ public int indexOf(Object theElement) { // search element[] for theElement for (int i = 0; i < size; i++) if (element[i].equals(theElement)) return i; // theElement not found return -1; } The Method remove public Object remove(int index) { checkIndex(index); // valid index, shift elements with higher index Object removedElement = element[index]; for (int i = index + 1; i < size; i++) element[i-1] = element[i]; element[--size] = null; // enable garbage collection return removedElement; } The Method add public void add(int index, Object theElement) { if (index < 0 || index > size) // invalid list position throw new IndexOutOfBoundsException ("index = " + index + " size = " + size); // valid index, make sure we have space if (size == element.length) // no space, double capacity element = ChangeArrayLength.changeLength1D(element, 2 * size); The Method add // shift elements right one position for (int i = size - 1; i >= index; i--) element[i + 1] = element[i]; element[index] = theElement; size++; } Faster Way To Shift Elements 1 Right System.arraycopy(element, index, element, index + 1, size - index); Convert To A String public String toString() { StringBuffer s = new StringBuffer("["); // put elements into the buffer for (int i = 0; i < size; i++) if (element[i] == null) s.append("null, "); else s.append(element[i].toString() + ", "); if (size > 0) s.delete(s.length() - 2, s.length()); // remove last ", " s.append("]"); // create equivalent String return new String(s); } Linear list Linked-Lists Representation Definisi • Linked list : linear list yang dibangun dari satu atau lebih node. • Node terdiri dari dua bagian : data field dan pointer. • Data field: bagian dari list node untuk menyimpan data. • Pointer : bagian dari list node untuk menunjuk node berikutnya. Node Link atau pointer data field Single linked list • Yaitu Linked list yang memiliki satu pointer. • Pointer bantu : firstnode Linked Representation c a e d firstNode pointer (or link) in e is null use a variable firstNode to get to the first element a b Normal Way To Draw A Linked List firstNode null a b c link or pointer field of node data field of node d e Linked Lists vs Array A0 A1 A2 A3 • 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. • 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 ditengahtengah array? Chain firstNode null a b c d e •A chain is a linked list in which each node represents one element. • There is a link or pointer from one element to the next. • The last node has a null pointer. Latihan Diketahui L=(a,b,c,d). L adalah sebuah linked lists.. Tentukan hasil yang didapatkan ketika dilakukan operasi berikut ini : a) b) c) d) e) f) isEmpty() size() get(0), get(2),get(6),get(-3) indexOf(a), indexOf(c), indexOf(q) remove(0), remove(2), remove(3) add(0,e), add(2,f), add(3,g), add(4,h), add(6,h), add(-3,h) (Gambarkan rangkaian node pembentuk linked list tersebut kondisi awal dan akhir tiap operasi) Node Representation package dataStructures; class ChainNode { // package visible data members Object element; ChainNode next; // constructors come here next element Constructors Of ChainNode null ChainNode() {} null ChainNode(Object element) {this.element = element;} ChainNode(Object element, ChainNode next) {this.element = element; this.next = next;} null element next element get(0) firstNode null a b c d e checkIndex(0); desiredNode = firstNode; // gets you to first node return desiredNode.element; get(1) firstNode null a b c d e checkIndex(1); desiredNode = firstNode.next; // gets you to second node return desiredNode.element; get(2) firstNode null a b c d e checkIndex(2); desiredNode = firstNode.next.next; // gets you to third node return desiredNode.element; get(5) firstNode null a b c d e checkIndex(5); // throws exception desiredNode = firstNode.next.next.next.next.next; // desiredNode = null return desiredNode.element; // null.element NullPointerException firstNode null a b c d e desiredNode = firstNode.next.next.next.next.next.next; // gets the computer mad // you get a NullPointerException Remove An Element firstNode null a b c remove(0) firstNode = firstNode.next; d e remove(2) firstNode null a b cc d e beforeNode first get to node just before node to be removed beforeNode = firstNode.next; remove(2) firstNode null a b c d e beforeNode now change pointer in beforeNode beforeNode.next = beforeNode.next.next; add(0,’f’) firstNode null f a b c d e newNod e Step 1: get a node, set its data and link fields ChainNode newNode = new ChainNode(new Character(‘f’), firstNode); add(0,’f’) firstNode null f a b c newNod e Step 2: update firstNode firstNode = newNode; d e One-Step add(0,’f’) firstNode null f a b c d e newNod e firstNode = new ChainNode( new Character(‘f’), firstNode); add(3,’f’) firstNode newNode f null a c b d e beforeNode • first find node whose index is 2 • next create a node and set its data and link fields ChainNode newNode = new ChainNode(new Character(‘f’), beforeNode.next); • finally link beforeNode to newNode beforeNode.next = newNode; Two-Step add(3,’f’) firstNode newNode f null a b c d e beforeNode beforeNode = firstNode.next.next; beforeNode.next = new ChainNode(new Character(‘f’), beforeNode.next); Double Linked List Definisi • Linked list dengan dua pointer(next & prev) • Pointer next : menghadap ke node yang lebih besar indexnya. • Pointer prev : menghadap ke node yang lebih kecil indexnya. Head & Tail • Head : menunjuk pada node pertama. • Tail : menunjuk pada node terakhir. • Pada node pertama, pointer prev mengarah ke null. • Pada node terakhir, pointer next mengarah ke null. Gambaran prev last next Data/item Double Representation class Node { Object dData; // data item Node next; // pointer next Node prev; // pointer prev ….. } Operasi • Penambahan/penyisipan • Penghapusan Penambahan Node Penambahan Node • • • • Penambahan di awal Penambahan di akhir Penambahan sebelum node tertentu Penambahan setelah node tertentu Asumsi awal Penambahan di Awal • Pointer bantu : baru • Langkah : – Baru.next = head – head.prev = Baru – head = baru Penambahan di Awal(1) last 84 Penambahan di Awal(2) last 85 Penambahan di Awal(3) last 86 Penambahan di Akhir Asumsi linked list awal : last 87 Penambahan di Akhir 1. Baru.prev = last last 88 Penambahan di Akhir 2. last.next = Baru last 89 Penambahan di Akhir 3. last = Baru last 90 Penambahan Setelah Node x • Pointer bantu : after Penambahan Setelah Node x Asumsi linked list awal : last 92 Penambahan Setelah Node x 1. Node after; after diarahkan ke posisi node 10, bisa dimulai dari head maupun last last 93 Penambahan Setelah Node x 2. Baru.prev = after last 94 Penambahan Setelah Node x 3. Baru.next = after.next last 95 Penambahan Setelah Node x 4. after.next.prev = Baru last 96 Penambahan Setelah Node x 5. after.next = Baru last 97 Penambahan Setelah Node x Hasil akhir : last 98 Penambahan Sebelum Node x Asumsi linked list awal : last 99 Penambahan Sebelum Node x 1. Node before; before diarahkan ke posisi node 5, bisa dimulai dari head maupun last last 100 Penambahan Sebelum Node x 2. Baru.prev = before.prev last 101 Penambahan Sebelum Node x 3. Baru.next = before last 102 Penambahan Sebelum Node x 4. before.prev.next = Baru last 103 Penambahan Sebelum Node x 5. before.prev = Baru last 104 Penambahan Sebelum Node x Hasil akhir : last 105 Penghapusan Node Operasi Hapus Node (Delete) • Hapus awal (Delete First) • Hapus akhir (Delete Last) • Hapus Node x 107 Asumsi Awal Asumsi linked list awal : last 108 Delete First 1. Node hapus; hapus = head; last 109 Delete First 2. head.next.prev = null last 110 Delete First 3. head = hapus.next last 111 Delete First last 112 Delete First Hasil akhir : last 113 Delete Last Asumsi linked list awal : last 114 Delete Last 1. Node hapus; hapus = last; last 115 Delete Last 2. last.prev.next = null last 116 Delete Last 3. last = hapus.prev last 117 Delete Last last 118 Delete Last Hasil akhir : last 119 Delete Node x Asumsi linked list awal : Misalkan x = 3 last last 120 Delete Node x 1. Node hapus; hapus diarahkan pada posisi node 3, bisa mulai dari head maupun last last 121 Delete Node x 2. hapus.prev.next = hapus.next; last 122 Delete Node x 3. hapus.next.prev = hapus.prev; last 123 Delete Node x last 124 Circular List Definisi • Circular List : list yang berbentuk cirrcular/melingkar, node depan terhubung dengan node paling belakang. Linked List: Insertion a b c d current Menyisipkan X pada lokasi setelah current. a current x x b c d Langkah-langkah menyisipkan yang lebih efisien tmp = new ListNode (x, current.next); a current b x current.next = tmp; a current b x Pertanyaan: • Selama ini contoh menyisipkan dan menghapus elemen dengan asumsi ada node current yang terletak sebelumnya. – Bagaimana menambahkan node pada urutan pertama pada linked list? – Bagaimana menghapus elemen pertama pada linked list? Latihan • Buatlah sebuah method untuk menghitung jumlah elemen dalam sebuah linked list! public static int listSize (LinkedList theList) { } Variasi Linked Lists Doubly-linked lists: Tiap list node menyimpan referensi node sebelum dan sesudahnya. Berguna bila perlu melakukan pembacaan linkedlist dari dua arah. prev A next head tail Variasi Linked Lists • Circular-linked lists: Node terakhir menyimpan referensi node pertama. Dapat diterapkan dengan atau tanpa header node. prev A B C next first Doubly-linked lists: InsertNext newNode = new DoublyLinkedListNode(x); 1 newNode.prev = current; 2 newNode.prev.next = newNode; … … 2 a b ? 1 current x Doubly-linked lists: insertNext A 4 B prev 2 current 6 X 3 5 1 next newNode 1 newNode = new DoublyLinkedListNode(x); 2 newNode.prev = current; 3 newNode.next = current.next; 4 newNode.prev.next = newNode; 5 newNode.next.prev = newNode; 6 current = newNode; Doubly-linked lists: DeleteCurrent 1.current.prev.next = current.next; 2.current.next.prev = current.prev; 3.current = current.prev; 1 a b 2 3 current x Rangkuman • • • • ListNode List, LinkedList dan variasinya Iterator class Kelebihan & kekurangan dari linked list – Growable – Overhead a pointer, new operator untuk membuat node. – Hanya bisa diakses secara sequential. Gambaran firstNode a b c d e Daftar Pustaka • L.N. Harnaningrum, Struktur Data menggunakan Java, Graha ilmu, 2010 • Siswanto, Algoritma & Struktur Data Linier, Graha Ilmu, 2010 • Ruli Manurung, Ade Azurat, Struktur Data dan Algoritma, Fasilkom UI, 2008