Como crio uma estrutura de dados de lista vinculada em Java? [fechadas]

135

Qual é a melhor maneira de criar uma lista vinculada em Java?

Lance Fisher
fonte
33
A melhor maneira de criar uma lista vinculada é usar a lista vinculada interna. Não reescreva classes integradas.
26640 Peter Lawrey
21
esta pergunta é legítima e muito construtiva para programadores discussão
anshulkatta

Respostas:

220

A solução óbvia para desenvolvedores familiarizados com Java é usar a classe LinkedList já fornecida em java.util . Digamos, no entanto, que você queira fazer sua própria implementação por algum motivo. Aqui está um exemplo rápido de uma lista vinculada que insere um novo link no início da lista, exclui do início da lista e percorre a lista para imprimir os links nela contidos. Os aprimoramentos para esta implementação incluem torná-la uma lista com vínculo duplo , adicionando métodos para inserir e excluir a partir do meio ou final e adicionando métodos get e classificar também.

Nota : No exemplo, o objeto Link na verdade não contém outro objeto Link - nextLink é na verdade apenas uma referência a outro 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
fonte
7
você também pode facilmente melhorar esse código para usar genéricos para o tipo de dados, em vez de armazenar um int e um double.
29409 shsteimer
51
@shsteimer: definitivamente, mas como o único bom uso desse código é demonstrar a técnica, isso não ajudaria ninguém. Isso apenas difundiria a idéia básica.
Joachim Sauer
8
Não é uma boa abordagem de OO ter public Link nextLinke operar nele fora da classe. Poderia ser respeitável quando Linkseria uma classe interna de LinkList. É outro monte de código escrito como Java era apenas outra versão do c.
Bart
1
Quando você insere, o seu primeiro item nunca vai ter um nextLink - a menos que eu estou faltando alguma coisa com referências Java
Chris S
Como posso implementar o método delete (index)?
JohnDow
55

Java tem uma implementação LinkedList , que você pode querer conferir. Você pode baixar o JDK e suas fontes em java.sun.com .

dlinsin
fonte
A Linkedlist do Java não permite inserir e remover elementos em posições arbitrárias?
Seun Osewa
10
Não é esse o objetivo de uma lista vinculada?
Jrockway 17/05
2
@Seun Osewa se você deseja adicionar a um arbitrárias pls posição usar um ArrayList :)
headgrowe
3
Em vez de baixar o JDK para visualizar sua implementação LinkedList, você pode apenas vê-lo LinkedList.javaonline aqui . Essa página até destaca a sintaxe do código e renderiza os comentários do Javadoc em linha.
Rory O'Kane
17

A lista vinculada acima é exibida na direção oposta. Eu acho que a implementação correta do método insert deve ser

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
fonte
1
Adicione novo no final, salvo indicação em contrário. :-)
9

É muito melhor usar o java.util.LinkedList, porque provavelmente é muito mais otimizado do que o que você escreverá.

Jakub Arnold
fonte
15
E vai funcionar pela primeira vez.
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
fonte