2
respostas

Lista ligada

Não sei porque esta repetindo os valores ... Era para aparecer [Raphael] [Raphael, Kaique] [Raphael, Kaique, Mariana] mas a cada linha ele repete o valor

Classe lista ligada

public class ListaLigada {

    public static void main(String[] args) {
       TestLista lista = new TestLista();

       lista.adicionanocomeco("Raphael");
        System.out.println(lista);
       lista.adicionanocomeco("Kaique");
        System.out.println(lista);
       lista.adicionanocomeco("Mariana");
       System.out.println(lista);
    }

}

Classe Celula

public class Celula {
    private Object element;
    private Celula proximo;

    public Celula(Object element, Celula proximo) {
        this.element = element;
        this.proximo = proximo;
    }

    public Object getElement() {
        return element;
    }

    public Celula getProximo() {
        return proximo;
    }

    public void setProximo(Celula proximo) {
        this.proximo = proximo;
    }




}

Classe TestLista

public class TestLista {
    private Celula primeira = null;
    private int totaldeelementos = 0;

    public void adicionanocomeco(Object elemento){
        Celula nova = new Celula(elemento, primeira);
        this.primeira = nova;
        totaldeelementos++ ;


    }

    @Override
    public String toString() {
        if(this.totaldeelementos == 0){
        return "[]";
        }
        Celula atual = primeira;

        StringBuilder builder = new StringBuilder("[");
        for(int i= 0; i<totaldeelementos; i++){
            builder.append(atual.getElement());
            builder.append(",");

            atual.getProximo();

            builder.append("]");


        }
        return builder.toString();
    }





    public void adiciona(Object elemento){}
    public void adiciona(int posicao, Object elemento){}
    public Object pega(int posicao){return null;}
    public void remove(int posicao){}
    public int tamanho(){return 0;}
    public boolean contem(){return false;}


}

por favor me ajudem a entender o que esta errado

2 respostas

Oi Raphael.

Acho que o problema está na sua função adicionanocomeco. Em nenhum momento você seta o proximo dos elementos que você insere, por isso eles acabam se perdendo e só fica um elemento na lista. Sua função deveria ser algo assim:

public void adicionanocomeco(Object elemento) {
     Celula nova = new Celula(elemento, primeira);
    nova.setProximo(this.primeira);
        this.primeira = nova;
        totaldeelementos++ ;
}

Você precisa adicionar um novo atributo Celula à classe TestLista, que irá referenciar a última célula adicionada.

private Celula ultima = null;

O ideal seria alterar o nome do método adicionanocomeco(), para adicionar(), e a lógica desse método para que a célula que está sendo adicionada seja a próxima da célula adicionada anteriormente.

public void adicionar(Object elemento) {
        Celula proximo = new Celula(elemento, null);
        if(primeira == null) {
            primeira = proximo;
        } else {
            ultima.setProximo(proximo);
        }
        ultima = proximo;
        totaldeelementos++ ;
    }

Claro, se não houver nenhuma célula ainda, então a célula a ser adicionada deve ser a primeira.

No método toString(), você deve alterar a ordem que adiciona as strings ao builder. Note que a vírgula só é adicionada se a célula tiver um próximo; desse jeito a última célula não terá uma vírgula após seu elemento. O último colchete deve ficar fora do loop.

A classe TestLista deve funcionar assim:

public class TestLista {

    private Celula primeira = null;
    private Celula ultima = null;
    private int totaldeelementos = 0;

    public void adicionar(Object elemento) {
        Celula proximo = new Celula(elemento, null);
        if(primeira == null) {
            primeira = proximo;
        } else {
            ultima.setProximo(proximo);
        }
        ultima = proximo;
        totaldeelementos++ ;
    }

    @Override
    public String toString() {
        if(this.totaldeelementos == 0){
            return "[]";
        }
        Celula atual = primeira;
        StringBuilder builder = new StringBuilder("[");

        for(int i= 0; i<totaldeelementos; i++){
            builder.append(atual.getElement());
            if(atual.getProximo() != null) {
                builder.append(",");
            }
            atual = atual.getProximo();
        }
        builder.append("]");
        return builder.toString();
    }

    public void adiciona(Object elemento){}
    public void adiciona(int posicao, Object elemento){}
    public Object pega(int posicao){return null;}
    public void remove(int posicao){}
    public int tamanho(){return 0;}
    public boolean contem(){return false;}

}

Ao usar esse exemplo, não esqueça de alterar a classe ListaLigada, para que chame o método adicionar() ao invés de adicionanocomeco().