new handout_6 [double linked list]

Upload: classicalistrazzz

Post on 17-Oct-2015

22 views

Category:

Documents


0 download

DESCRIPTION

loj

TRANSCRIPT

  • 5/27/2018 New Handout_6 [Double Linked List]

    1/71

    List Linear :

    Linked List (Double Linkedlist)

    Teknik Informatika

    Universitas Muhammadiyah Malang2012

    Algoritma dan Struktur Data

  • 5/27/2018 New Handout_6 [Double Linked List]

    2/71

    Tujuan Instruksional

    Mahasiswa mampu :

    Memahami struktur data linked list

    Memahami cara pengoperasian struktur data

    linked list

    Mengimplementasikan struktur data linked list

  • 5/27/2018 New Handout_6 [Double Linked List]

    3/71

    Topik

    Bentuk dasar linked list

    deklarasi class linked list

    Tambah node Hapus node

    Penyisipan node

    ADT Linked List

  • 5/27/2018 New Handout_6 [Double Linked List]

    4/71

    4

    Double Linked List

    Double : artinya field pointer-nya dua buah dan duaarah, yang menunjuk ke node sebelum dansesudahnya.

    Berguna bila perlu melakukan pembacaan linkedlistdari dua arah.

    Double linked list memiliki 2 buah pointer yaitupointer nextdan prev.

    Pointer next : mengarah ke node belakang (tail).

    Pointer prev : mengarah ke node depan (head).

  • 5/27/2018 New Handout_6 [Double Linked List]

    5/71

    Ilustrasi Node Double

    Ketika masih ada satu node maka kedua pointer

    (next dan prev) akan menunjuk ke NULL)

    Double linked list dapat diakses dari dua arah :1. Dari depan ke belakang (head ke tail)

    2. Dari belakang ke depan (tail ke head)

    prev DATA next

  • 5/27/2018 New Handout_6 [Double Linked List]

    6/71

    Double Linked List

    Ketika double linked list memiliki banyak node makanode yang paling depan pointer prev-nya menunjukke NULL. Sedangkan node yang paling belakangpointer next-nya yang menunjuk ke NULL.

    a b c d e

    null

    firstNode

    null

    lastNode

  • 5/27/2018 New Handout_6 [Double Linked List]

    7/71

    Pointer Head dan Tail

    Sama seperti single linked list, pada double linked

    dibutuhkan pointer bantu yaitu head dan tail.

    Head : menunjuk pada node yang paling depan.

    Tail : menunjuk pada node yang paling belakang.

  • 5/27/2018 New Handout_6 [Double Linked List]

    8/71

    Double Linked List

    Contoh ilustrasi double linked list yangmemiliki 4 node :

    previous

    next

  • 5/27/2018 New Handout_6 [Double Linked List]

    9/71

    Double Representation

    Penjelasan:

    Pembuatan class bernama Node2P, yang berisi variabel data

    bertipe Object dan 2 variabel pointer bertipe Node2P yaitu :next dan prev.

    Field data : digunakan untuk menyimpan data/nilai padalinked list. Field pointer : digunakan untuk menyimpan alamatnode berikutnya.

    class Node2P{

    int data; // dataNode2P next; // pointer nextNode2P prev; // pointer prev

    }

    Ilustrasi :

    next

    data

    prev

  • 5/27/2018 New Handout_6 [Double Linked List]

    10/71

    10

    Alokasi Simpul

    Node2P baru = new Node2P(10);

  • 5/27/2018 New Handout_6 [Double Linked List]

    11/71

    Operasi Linked List

    1. inisialisasi

    2. isEmpty

    3. size4. Penambahan

    5. Penghapusan

    6. Penyisipan7. Pencarian

    8. Pengaksesan

  • 5/27/2018 New Handout_6 [Double Linked List]

    12/71

    12

    (1) Inisialisasi Awal Pointer Head & Tail

    Node2P head = null;Node2P tail= null;

    head tailNULL

  • 5/27/2018 New Handout_6 [Double Linked List]

    13/71

    (2)isEmpty

    Digunakan untuk mengetahui linked dalam

    kondisi kosong.

    Kondisi kosong : jika size = 0 atau jika

    head=tail=null.

    boolean isEmpty()

    {

    return size==0;

    }

  • 5/27/2018 New Handout_6 [Double Linked List]

    14/71

    (3) size

    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;

    }

  • 5/27/2018 New Handout_6 [Double Linked List]

    15/71

    (4) Penambahan

    Dibedakan menjadi :

    1. Penambahan dari depan

    2. Penambahan dari belakang3. Penambahan setelah node tertentu

    4. Penambahan sebelum node tertentu

  • 5/27/2018 New Handout_6 [Double Linked List]

    16/71

    Membentuk Simpul Awal

    Jika kondisi awal linked list kosong, maka head dan

    tail sama-sama menunjuk node baru.

    head = tail= Baru

    16

  • 5/27/2018 New Handout_6 [Double Linked List]

    17/71

    Penambahan dari Depan

    Jika linked list terdapat node, maka :

    Penambahan node baru diletakkan di depan node

    yang ditunjuk oleh head.

    Pointer prev dari node depan diarahkan ke node

    baru.

    Terjadi pergeseran pointer head kearah node

    baru.

  • 5/27/2018 New Handout_6 [Double Linked List]

    18/71

    Penambahan dari Depan

    void addFirst(Node2P input){if (isEmpty()){

    head=input;

    tail=input;}else{

    input.next = head;head.previous = input;

    head = input;} size++;

    }

  • 5/27/2018 New Handout_6 [Double Linked List]

    19/71

    19

    Insert First

    1. Baru.next = head

  • 5/27/2018 New Handout_6 [Double Linked List]

    20/71

    20

    Insert First

    2. head.prev = Baru

  • 5/27/2018 New Handout_6 [Double Linked List]

    21/71

    21

    Insert First

    3. head = baru

  • 5/27/2018 New Handout_6 [Double Linked List]

    22/71

    Penambahan dari Belakang

    Jika linked list terdapat node, maka :

    Penambahan node baru diletakkan di belakang

    node yang ditunjuk oleh tail.

    Pointer next dari node belakang diarahkan ke

    node baru.

    Terjadi pergeseran pointer tail kearah node baru.

  • 5/27/2018 New Handout_6 [Double Linked List]

    23/71

    Penambahan dari Belakang

    void addLast(Node2P input){if (isEmpty()){

    head = input;tail = input;

    }else{input.previous = tail;tail.next = input;

    tail = input;} size++;

    }

  • 5/27/2018 New Handout_6 [Double Linked List]

    24/71

    24

    Insert Last

    Kondisi awal linked list :

    Terdapat 2 node

  • 5/27/2018 New Handout_6 [Double Linked List]

    25/71

    25

    Insert Last

    1. Baru.prev = tail

  • 5/27/2018 New Handout_6 [Double Linked List]

    26/71

    26

    Insert Last

    2. tail.next = Baru

  • 5/27/2018 New Handout_6 [Double Linked List]

    27/71

    27

    Insert Last

    3. tail= Baru

  • 5/27/2018 New Handout_6 [Double Linked List]

    28/71

    Penambahan Setelah Node x

    Penambahan node baru dilakukan dibelakang

    node x (node tertentu).

    Node x adalah node yang memiliki data yang

    sama dengan key.

    Jika tidak ditemukan node yang dimaksud

    maka penambahan tidak terjadi.

  • 5/27/2018 New Handout_6 [Double Linked List]

    29/71

    Penambahan setelah Node x

    void insertAfter(Object key,Node2P input){Node2P temp = head;do{

    if(temp.data==key){input.previous = temp;input.next = temp.next;temp.next.previous = input;temp.next = input;size++;

    System.out.println("Insert data is succeed.");break;

    }temp = temp.next;

    }while (temp!=null);}

  • 5/27/2018 New Handout_6 [Double Linked List]

    30/71

    Insert After Node x

    Kondisi awal linked list :

    Terdapat 3 node pada linked list

    misalkan key = 10

  • 5/27/2018 New Handout_6 [Double Linked List]

    31/71

    Insert After Node x

    Dibutuhkan pointer bantu untuk mencari node x. Misalkanpointer bantu tersebut adalah after.

    1. Node after = head;

    Pointer after akan bergeser mencari node yang sesuai.

  • 5/27/2018 New Handout_6 [Double Linked List]

    32/71

    Insert After Node x

    2. Baru.prev = after

  • 5/27/2018 New Handout_6 [Double Linked List]

    33/71

    33

    Insert After Node x

    3. Baru.next = after.next

  • 5/27/2018 New Handout_6 [Double Linked List]

    34/71

    34

    Insert After Node x

    4. after.next.prev = Baru

  • 5/27/2018 New Handout_6 [Double Linked List]

    35/71

    35

    Insert After Node x

    5. after.next = Baru

  • 5/27/2018 New Handout_6 [Double Linked List]

    36/71

    36

    Insert After Node x

    Hasil akhir :

  • 5/27/2018 New Handout_6 [Double Linked List]

    37/71

    Penambahan Sebelum Node x

    Penambahan node baru dilakukan didepan

    node x (node tertentu).

    Node x adalah node yang memiliki data yang

    sama dengan key.

    Jika tidak ditemukan node yang dimaksud

    maka penambahan tidak terjadi.

  • 5/27/2018 New Handout_6 [Double Linked List]

    38/71

    Penambahan sebelum Node tertentu

    void insertBefore(Object key,Node2P input){

    Node2P temp = head;while (temp != null){

    if (temp.data == key){

    if(temp == head){

    this.addFirst(input);System.out.println("Insert data is succeed.");size++;break;

    }else{

    input.previous = temp.previous;input.next = temp;

    temp.previous.next = input;temp.previous = input;System.out.println("Insert data is succeed.");size++;break;

    }}temp = temp.next;

    }

  • 5/27/2018 New Handout_6 [Double Linked List]

    39/71

    39

    Insert Before Node x

    Kondisi awal linked list :

    Terdapat 4 node pada linked list

    misalkan key = 5

  • 5/27/2018 New Handout_6 [Double Linked List]

    40/71

    40

    Insert Before Node x

    1. Node before = head;

    pointer before mencari node yang sesuai.

  • 5/27/2018 New Handout_6 [Double Linked List]

    41/71

    41

    Insert Before Node x

    2. Baru.prev = before.prev

  • 5/27/2018 New Handout_6 [Double Linked List]

    42/71

    42

    Insert Before Node x

    3. Baru.next = before

  • 5/27/2018 New Handout_6 [Double Linked List]

    43/71

    43

    Insert Before Node x

    4. before.prev.next = Baru

  • 5/27/2018 New Handout_6 [Double Linked List]

    44/71

    44

    Insert Before Node x

    5. before.prev = Baru

  • 5/27/2018 New Handout_6 [Double Linked List]

    45/71

    45

    Insert Before Node x

    Hasil akhir :

  • 5/27/2018 New Handout_6 [Double Linked List]

    46/71

    (5) Penghapusan

    Dibedakan menjadi :

    1. Hapus node depan

    2. Hapus node belakang

    3. Hapus node tertentu

  • 5/27/2018 New Handout_6 [Double Linked List]

    47/71

    Penghapusan

    Jika linked list dalam keadaan kosong maka

    tidak dapat dilakukan penghapusan.

    Jika pada linked list hanya terdapat 1 node,

    maka head dan tail menunjuk ke NULL.

  • 5/27/2018 New Handout_6 [Double Linked List]

    48/71

    Hapus Node Depan

    Penghapusan dilakukan pada node paling

    depan, yaitu node yang ditunjuk oleh head.

    Terjadi pergeseran head ke belakang.

  • 5/27/2018 New Handout_6 [Double Linked List]

    49/71

    Hapus node depan

    void removeFirst(){Node2P temp = head;if (!isEmpty()){

    if (head == tail)head = tail = null;

    else{

    head.next.previous = null;head = temp.next;

    } size--;}

    elseSystem.out.println("Data is empty!");

    }

  • 5/27/2018 New Handout_6 [Double Linked List]

    50/71

    50

    Delete First

    kondisi awal linked list:

    Terdiri dari 5 node

  • 5/27/2018 New Handout_6 [Double Linked List]

    51/71

    51

    Delete First

    1. Node hapus = head;

  • 5/27/2018 New Handout_6 [Double Linked List]

    52/71

    52

    Delete First

    2. head.next.prev = null

  • 5/27/2018 New Handout_6 [Double Linked List]

    53/71

    53

    Delete First

    3. head = hapus.next

  • 5/27/2018 New Handout_6 [Double Linked List]

    54/71

    Delete First

    54

    Node 8 sudah terhapus

  • 5/27/2018 New Handout_6 [Double Linked List]

    55/71

    55

    Delete First

    Hasil akhir :

  • 5/27/2018 New Handout_6 [Double Linked List]

    56/71

    Hapus Node Belakang

    Penghapusan dilakukan pada node paling

    belakang, yaitu node yang ditunjuk oleh tail.

    Terjadi pergeseran tail ke depan.

  • 5/27/2018 New Handout_6 [Double Linked List]

    57/71

    Hapus node belakang

    void removeLast(){Node2P temp = tail;if (!isEmpty()){

    if (tail == head){

    head = tail = null;}else {

    tail.previous.next = null;tail=temp.previous;

    } size--;

    }else System.out.println("Data is empty!");

    }

  • 5/27/2018 New Handout_6 [Double Linked List]

    58/71

    58

    Delete Last

    Kondisi awal linked list :

    Linked list terdiri dari 4 node

  • 5/27/2018 New Handout_6 [Double Linked List]

    59/71

    59

    Delete Last

    1. Node hapus=tail;

  • 5/27/2018 New Handout_6 [Double Linked List]

    60/71

    60

    Delete Last

    2. tail.prev.next = null

  • 5/27/2018 New Handout_6 [Double Linked List]

    61/71

    61

    Delete Last

    3. tail= hapus.prev

  • 5/27/2018 New Handout_6 [Double Linked List]

    62/71

    62

    Delete Last

    Node 6 sudah terhapus

  • 5/27/2018 New Handout_6 [Double Linked List]

    63/71

    63

    Delete Last

    Hasil akhir :

  • 5/27/2018 New Handout_6 [Double Linked List]

    64/71

    Hapus Node x

    Penghapusan dilakukan pada node x (node

    tertentu).

    Node x adalah node yang memiliki data sama

    dengan key.

    Jika tidak ditemukan node yang sesuai maka

    penghapusan tidak dapat dilakukan.

    H d t t t

  • 5/27/2018 New Handout_6 [Double Linked List]

    65/71

    Hapus node tertentuvoid remove(Object key){

    Node2P temp = head;if (!isEmpty()){

    while (temp != null){if (temp.data == key){

    if (temp == head){this.removeFirst();size--;break;

    }

    else{temp.previous.next = temp.next;temp.next.previous = temp.previous;if(temp.next == null)

    tail=temp;size--;break;

    }}temp = temp.next;

    }}else

    System.out.println("Data is empty!");

    size--;}

  • 5/27/2018 New Handout_6 [Double Linked List]

    66/71

    66

    Delete Node x

    Kondisi awal linked list :

    Linked list memiliki 3 node. Misalkan key = 3

  • 5/27/2018 New Handout_6 [Double Linked List]

    67/71

    67

    Delete Node x

    1. Node hapus=head;hapus adalah pointer bantu yang akan mencarinode yang dimaksud (node x).

  • 5/27/2018 New Handout_6 [Double Linked List]

    68/71

    68

    Delete Node x

    2. hapus.prev.next = hapus.next;

  • 5/27/2018 New Handout_6 [Double Linked List]

    69/71

    69

    Delete Node x

    3. hapus.next.prev = hapus.prev;

  • 5/27/2018 New Handout_6 [Double Linked List]

    70/71

    70

    Delete Node x

    Node 3 sudah terhapus

  • 5/27/2018 New Handout_6 [Double Linked List]

    71/71

    Sumber

    Arna Fariza, Algoritma Struktur Data : Double

    Linked List, PENS-ITS, Surabaya