Cum pot crea o structură de date a listei legate în Java?

Care este cel mai bun mod de a face o listă legată în Java?

0
fr hi bn
Cea mai bună modalitate de a crea o listă legată este să utilizați lista încorporată în legătură. Nu re-scrie construit în clase.
adăugat autor Peter Lawrey, sursa
această întrebare este legitimă și foarte constructivă pentru discuțiile programatorilor
adăugat autor anshulkatta, sursa

6 răspunsuri

Este mult mai bine sa folosesti java.util.LinkedList, pentru ca este probabil mult mai optimizat decat cel pe care il vei scrie.

0
adăugat
Și va funcționa prima oară.
adăugat autor Peter Lawrey, sursa

Java are o implementare LinkedList , care s-ar putea să vrei să te uiți. Puteți descărca JDK și sursele sale la java.sun.com .

0
adăugat
În loc de a descărca JDK pentru a vedea implementarea lui LinkedList , poți doar vizualizați LinkedList.java online aici . Această pagină chiar și sintaxă - evidențiază codul și face comentariile Javadoc inline.
adăugat autor Rory O'Kane, sursa
Nu este tocmai acest punct al unei liste legate?
adăugat autor jrockway, sursa
Linkedlistul Java nu vă permite să inserați și să eliminați elemente în poziții arbitrare?
adăugat autor Seun Osewa, sursa
@Seun Osewa dacă doriți să adăugați la o poziție arbitrară pls utilizați un ArrayList :)
adăugat autor headgrowe, sursa

Utilizați java.util.LinkedList . Asa:

list = new java.util.LinkedList()
0
adăugat

Soluția evidentă pentru dezvoltatorii familiarizați cu Java este utilizarea clasei LinkedList deja furnizată în java.util . Spune, totuși, că ați vrut să vă faceți propria implementare din anumite motive. Iată un exemplu rapid al unei linkuri asociate care introduce o nouă legătură la începutul listei, șterge de la începutul listei și buclele prin listă pentru a tipări legăturile conținute în listă. Îmbunătățirile acestei implementări includ crearea unei listă dublu-conectată , adăugarea de metode la inserați și ștergeți sau se termină, adăugând și metode obțineți și sortați .

Note: In the example, the Link object doesn't actually contain another Link object - nextLink is actually only a reference to another 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();
    }
}
0
adăugat
de asemenea, puteți îmbunătăți destul de ușor acest cod pentru a utiliza generice pentru tipul de date, în loc să stocați un int și un dublu.
adăugat autor shsteimer, sursa
Când inserați, primul dvs. element nu va primi niciodată o legătură NextLink - cu excepția cazului în care lipsesc ceva cu referințe Java
adăugat autor Chris S, sursa
Cum pot implementa metoda de ștergere (index)?
adăugat autor JohnDow, sursa
@shsteimer: destul de sigur, dar deoarece destul de mult folosirea numai a acestui cod este de a demonstra tehnica, nu ar ajuta pe nimeni. Aceasta ar difuza doar ideea de bază.
adăugat autor Joachim Sauer, sursa
Nu este bine ca abordarea OO să aibă public Link nextLink și să opereze pe ea în afara clasei. Ar putea fi respectabil când Link ar fi o clasă internă de LinkList . Este un alt buchet de cod scris ca Java a fost doar o alta versiune-de-c.
adăugat autor Bart, sursa
Dacă ștergeți dintr-o listă goală, veți obține un NullPointerException, în special atunci când încercați să accesați first.nextLink
adăugat autor Bad Request, sursa

Lista de link-uri de mai sus este afișată în direcție opusă. Cred că ar trebui să fie implementarea corectă a metodei insert

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;
    }
} 
0
adăugat
//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;
            }
        }
    }
}
0
adăugat