What’s wrong with my chained list?

Asked

Viewed 90 times

5

I implemented a chained list but when I enter 2 items, I remove the last one and add it again, for some reason it says that the value is null.

public class ListaDinamica<T> {    
    private class Celula<E>{
        E item;
        Celula<E> prox;
    } 

    private Celula<T> primeiro;
    private Celula<T> ultimo;
    private int tamanho;

    public ListaDinamica(){
        this.primeiro = new Celula<>();
        this.ultimo = this.primeiro;
        this.tamanho = 0;
    }

    public ListaDinamica(ListaDinamica<T> objetos){
        this();
        for(int i=0;i<objetos.size();i++){
            this.add(objetos.get(i));
        }
    }

    public ListaDinamica(List<T> objetos){
        this();
        for(int i=0;i<objetos.size();i++){
            this.add(objetos.get(i));
        }
    }

    public boolean isEmpty(){
        return size()==0;
    }

    public void add(T objeto){
        if(isEmpty()){
            Celula<T> aux = new Celula<>();
            aux.item = objeto;
            this.primeiro.prox = aux;
            this.ultimo = aux;
            this.tamanho++;
        }
        else{
            this.ultimo.prox = new Celula<>();
            this.ultimo = this.ultimo.prox;
            this.ultimo.item = objeto;
            this.ultimo.prox = null;
            this.tamanho++;
        }
    }

    public void remove(int i){
        if(isEmpty())return;
        if(i==0){
            this.primeiro.prox = this.primeiro.prox.prox;
            this.tamanho--;
        }
        else{
            Celula<T> aux = this.primeiro.prox;
            for(int j=0;j<i;j++){
                if(j==i-1){
                    aux.prox = aux.prox.prox;
                    this.tamanho--;
                }
                else{
                    aux = aux.prox;
                }
            }
        }
    }

    public T get(int i){
        if(isEmpty()) {
            System.out.println("LISTA VAZIA");
            return null;
        }
        if(i>=size()){
            System.out.println("INDEX INVALIDO");
            return null;
        }
        Celula<T> aux = this.primeiro.prox;
        for(int j=0;j<i;j++){
            aux = aux.prox;
        }
        return aux.item;
    }

    public int size(){
        return this.tamanho;
    }
}

And the test I did on Main that goes wrong:

public static void main(String[] args) {
    ListaDinamica<String> lista = new ListaDinamica<>();
    String s1 = "TESTE1";
    String s2 = "TESTE2";
    lista.add(s1);
    lista.add(s2);
    lista.remove(1);
    lista.add(s2);
    for(int i=0;i<lista.size();i++){
        System.out.println(lista.get(i));
    }
}

I can’t see where it’s wrong, I’ve changed my code many times and it doesn’t work..

1 answer

6


Your problem is that in remove you are not updating the ultimo. So when you remove the last element the field ultimo points to a node (cell) that no longer belongs to the list. When trying to add the element (or add anything) it adds to the this.ultimo, so that the new node is not accessible from this.primeiro.

To resolve, update the ultimo in his method remove:

public void remove(int i){
    if(isEmpty())return;
    if(i==0){
        this.primeiro.prox = this.primeiro.prox.prox;
        this.tamanho--;
        this.ultimo = primeiro; // <--
    }
    else{
        Celula<T> aux = this.primeiro.prox;
        for(int j=0;j<i;j++){
            if(j==i-1){
                aux.prox = aux.prox.prox;
                if ( i == this.tamanho-1 ) // <--
                    this.ultimo = aux;
                this.tamanho--;
            }
            else{
                aux = aux.prox;
            }
        }
    }
}

Example in the ideone.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.