Bagaimana cara membuat Struktur Data Daftar Tertaut di Java? [Tutup]

136

Apa cara terbaik untuk membuat daftar tertaut di Java?

Lance Fisher
sumber
33
Cara terbaik untuk membuat daftar tertaut adalah dengan menggunakan daftar tertaut bawaan. Jangan menulis ulang kelas bawaan.
Peter Lawrey
21
pertanyaan ini sah dan sangat konstruktif untuk diskusi pemrogram
anshulkatta

Jawaban:

220

Solusi yang jelas untuk pengembang yang akrab dengan Java adalah dengan menggunakan kelas LinkedList yang sudah disediakan di java.util . Katakanlah, bagaimanapun, Anda ingin membuat implementasi Anda sendiri karena suatu alasan. Berikut adalah contoh cepat dari daftar tertaut yang menyisipkan tautan baru di awal daftar, menghapus dari awal daftar dan memutar melalui daftar untuk mencetak tautan yang ada di dalamnya. Peningkatan implementasi ini termasuk menjadikannya daftar tertaut ganda , menambahkan metode untuk menyisipkan dan menghapus dari tengah atau akhir, dan dengan menambahkan metode get dan sortir juga.

Catatan : Dalam contoh, objek Link sebenarnya tidak berisi objek Link lain - nextLink sebenarnya hanya referensi ke link lain.

class Link {
    public int data1;
    public double data2;
    public Link nextLink;

    //Link constructor
    public Link(int d1, double d2) {
        data1 = d1;
        data2 = d2;
    }

    //Print Link data
    public void printLink() {
        System.out.print("{" + data1 + ", " + data2 + "} ");
    }
}

class LinkList {
    private Link first;

    //LinkList constructor
    public LinkList() {
        first = null;
    }

    //Returns true if list is empty
    public boolean isEmpty() {
        return first == null;
    }

    //Inserts a new Link at the first of the list
    public void insert(int d1, double d2) {
        Link link = new Link(d1, d2);
        link.nextLink = first;
        first = link;
    }

    //Deletes the link at the first of the list
    public Link delete() {
        Link temp = first;
        if(first == null){
         return null;
         //throw new NoSuchElementException(); // this is the better way. 
        }
        first = first.nextLink;
        return temp;
    }

    //Prints list data
    public void printList() {
        Link currentLink = first;
        System.out.print("List: ");
        while(currentLink != null) {
            currentLink.printLink();
            currentLink = currentLink.nextLink;
        }
        System.out.println("");
    }
}  

class LinkListTest {
    public static void main(String[] args) {
        LinkList list = new LinkList();

        list.insert(1, 1.01);
        list.insert(2, 2.02);
        list.insert(3, 3.03);
        list.insert(4, 4.04);
        list.insert(5, 5.05);

        list.printList();

        while(!list.isEmpty()) {
            Link deletedLink = list.delete();
            System.out.print("deleted: ");
            deletedLink.printLink();
            System.out.println("");
        }
        list.printList();
    }
}
Aaron
sumber
7
Anda juga dapat dengan mudah meningkatkan kode ini untuk menggunakan generik untuk tipe data daripada menyimpan int dan double.
shsteimer
51
@shsteimer: sangat pasti, tetapi karena hampir satu-satunya penggunaan yang baik dari kode ini adalah untuk mendemonstrasikan teknik, itu tidak akan membantu siapa pun. Itu hanya akan menyebarkan ide dasarnya.
Joachim Sauer
8
Pendekatan OO tidak baik untuk memiliki public Link nextLinkdan mengoperasikannya di luar kelas. Bisa dihormati ketika Linkakan menjadi kelas internal LinkList. Ini adalah sekelompok kode lain yang ditulis karena Java hanyalah versi-lain-c.
Bart
1
Saat Anda Menyisipkan, item pertama Anda tidak akan pernah mendapatkan tautan berikutnya - kecuali saya kehilangan sesuatu dengan referensi Java
Chris S
Bagaimana cara menerapkan metode delete (indeks)?
JohnDow
55

Java memiliki implementasi LinkedList , yang mungkin ingin Anda periksa. Anda dapat mengunduh JDK dan sumbernya di java.sun.com .

dlinsin
sumber
Apakah Linkedlist Java tidak mengizinkan Anda memasukkan dan menghapus elemen pada posisi arbitrer?
Seun Osewa
10
Bukankah itu inti dari daftar tertaut?
jrockway
2
@Seun Osewa jika Anda ingin menambahkan pada posisi yang sewenang-wenang, silakan gunakan ArrayList :)
headgrowe
3
Alih-alih mengunduh JDK untuk melihat implementasinya LinkedList, Anda dapat melihatnya LinkedList.javaonline di sini . Halaman itu bahkan menyoroti sintaks kode dan membuat komentar Javadoc sebaris.
Rory O'Kane
18

Daftar terkait di atas ditampilkan dalam arah yang berlawanan. Saya pikir penerapan metode penyisipan yang benar seharusnya

public void insert(int d1, double d2) { 
    Link link = new Link(d1, d2); 

    if(first==null){
        link.nextLink = null;
        first = link; 
        last=link;
    }
    else{
        last.nextLink=link;
        link.nextLink=null;
        last=link;
    }
} 
arnab sarkar
sumber
1
Tambahkan yang baru di akhir kecuali dinyatakan lain. :-)
9

Jauh lebih baik menggunakan java.util.LinkedList, karena mungkin jauh lebih optimal, daripada yang akan Anda tulis.

Jakub Arnold
sumber
16
Dan itu akan berhasil pertama kali.
Peter Lawrey
7
//slightly improved code without using collection framework

package com.test;

public class TestClass {

    private static Link last;
    private static Link first;

    public static void main(String[] args) {

        //Inserting
        for(int i=0;i<5;i++){
            Link.insert(i+5);
        }
        Link.printList();

        //Deleting
        Link.deletefromFirst();
        Link.printList();
    }


    protected  static class Link {
        private int data;
        private Link nextlink;

        public Link(int d1) {
            this.data = d1;
        }

        public static void insert(int d1) {
            Link a = new Link(d1);
            a.nextlink = null;
            if (first != null) {
                last.nextlink = a;
                last = a;
            } else {
                first = a;
                last = a;
            }
            System.out.println("Inserted -:"+d1);
        }

        public static void deletefromFirst() {
            if(null!=first)
            {
                System.out.println("Deleting -:"+first.data);
                first = first.nextlink;
            }
            else{
                System.out.println("No elements in Linked List");
            }
        }

        public static void printList() {
            System.out.println("Elements in the list are");
            System.out.println("-------------------------");
            Link temp = first;
            while (temp != null) {
                System.out.println(temp.data);
                temp = temp.nextlink;
            }
        }
    }
}
Anitha A
sumber