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


135

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


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();
    }
}

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 .


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;
    }
} 

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á.


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;
            }
        }
    }
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.