What's wrong with my threaded list?

5

I've implemented a linked list but when I enter 2 items, I remove the last one and add it again, for some reason it says 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 in 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 not see where it is wrong, I've changed my code many times and it does not work ..

    
asked by anonymous 09.09.2015 / 18:11

1 answer

6

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

To resolve, update ultimo in your remove method:

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

    
09.09.2015 / 18:22