Wie erstelle ich eine verknüpfte Listendatenstruktur in Java? [geschlossen]

135

Was ist der beste Weg, um eine verknüpfte Liste in Java zu erstellen?

Lance Fisher
quelle
33
Der beste Weg, eine verknüpfte Liste zu erstellen, ist die Verwendung der integrierten verknüpften Liste. Schreiben Sie eingebaute Klassen nicht neu.
Peter Lawrey
21
Diese Frage ist legitim und sehr konstruktiv für die Diskussion der Programmierer
Anshulkatta

Antworten:

220

Die offensichtliche Lösung für Entwickler, die mit Java vertraut sind, besteht darin, die LinkedList- Klasse zu verwenden, die bereits in java.util bereitgestellt wird . Angenommen, Sie wollten aus irgendeinem Grund eine eigene Implementierung erstellen. Hier ist ein kurzes Beispiel für eine verknüpfte Liste, die einen neuen Link am Anfang der Liste einfügt, am Anfang der Liste löscht und die Liste durchläuft, um die darin enthaltenen Links zu drucken. Erweiterungen zu dieser Implementierung umfassen sie eine Herstellung doppelt verknüpften Liste , Methoden hinzufügen einfügen und löschen von der Mitte oder am Ende, und durch Zugabe von get und Art sowie Methoden.

Hinweis : Im Beispiel enthält das Link-Objekt kein anderes Link-Objekt. NextLink ist eigentlich nur ein Verweis auf einen anderen Link.

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
quelle
7
Sie können diesen Code auch ganz einfach verbessern, um Generika für den Datentyp zu verwenden, anstatt ein int und ein double zu speichern.
Shsteimer
51
@shsteimer: Auf jeden Fall, aber da der einzige gute Nutzen dieses Codes darin besteht, die Technik zu demonstrieren, würde es niemandem helfen. Es würde nur die Grundidee verbreiten.
Joachim Sauer
8
Es ist kein guter OO-Ansatz, public Link nextLinkihn außerhalb der Klasse zu haben und damit zu arbeiten. Es könnte respektabel sein, wann Linkeine interne Klasse von wäre LinkList. Es ist eine weitere Menge Code, die geschrieben wurde, da Java nur eine andere Version von c war.
Bart
1
Wenn Sie einfügen, wird Ihr erstes Element nie einen nextLink erhalten - es sei denn, ich vermisse etwas mit Java-Referenzen
Chris S
Wie kann ich die Löschmethode (Indexmethode) implementieren?
JohnDow
55

Java verfügt über eine LinkedList- Implementierung, die Sie möglicherweise überprüfen möchten . Sie können das JDK und seine Quellen unter java.sun.com herunterladen .

Dlinsin
quelle
Können Sie in Javas Linkedlist keine Elemente an beliebigen Positionen einfügen und entfernen?
Seun Osewa
10
Ist das nicht der springende Punkt einer verknüpften Liste?
Jrockway
2
@Seun Osewa, wenn Sie an einer beliebigen Position hinzufügen möchten, verwenden Sie bitte eine ArrayList :)
headgrowe
3
Anstatt das JDK herunterzuladen, um dessen Implementierung anzuzeigen LinkedList, können Sie es hier einfach online anzeigenLinkedList.java . Diese Seite hebt sogar den Code durch Syntax hervor und rendert die Javadoc-Kommentare inline.
Rory O'Kane
17

Die oben verknüpfte Liste wird in entgegengesetzter Richtung angezeigt. Ich denke, die korrekte Implementierung der Insert-Methode sollte sein

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
quelle
1
Fügen Sie am Ende neu hinzu, sofern nicht anders angegeben. :-)
9

Es ist viel besser, java.util.LinkedList zu verwenden, da es wahrscheinlich viel optimierter ist als das, das Sie schreiben werden.

Jakub Arnold
quelle
15
Und es wird beim ersten Mal funktionieren.
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.
quelle