Help with simply linked list of java

1

I have a package with the codes below to implement a Simple Chained List. Apparently everything is correct in the classes, but when I run my main I get as a return what I believe to be the memory reference of the nodes and not the value itself.

I think the error should be in the get method call. Any ideas how to solve this problem ???

********** MAIN ***********

public class Teste<T> extends Node<T> {

    public static void main(String[] args) {

        //INICIALIZANDO A LISTA
        List<Double> lista = new LinkedList();

        //TESTANDO SE A LISTA ESTA VAZIA OU NAO
        if(lista.isEmpty())
            System.out.println("lista vazia\n");
        else
            System.out.println("lista nao esta vazia\n");

        //PREENCHENDO A LISTA
        for(int i = 0;i<=4;i++) {
            Integer n = new Integer(i);
            lista.add(n *1.0);
        }
        System.out.println("\nencheu\n");
        //TESTANDO SE A LISTA ESTA VAZIA DEPOIS DE PREENCHER

        if(lista.isEmpty())
            System.out.println("lista vazia\n");
        else
            System.out.println("lista nao esta vazia\n");


        //IMPRIMINDO A LISTA 
        for (int i = 0;i<=4;i++) {
            System.out.println(" "+lista.get(i));
        }

    System.out.println("Valor do primeiro elemento é : "+lista.first()+"\n");
    System.out.println("A lista contem o valor ? "+lista.contains(2.0)+"\n");
    }
}

****** INTERFACE AND ADDITIONAL CLASSES **********

public interface List<T> {

    void add(T obj);
    void set(int position, T obj);
    void remove(T obj);
    void remove(int position);
    T get(int position);
    T first();
    T last();
    boolean isEmpty();
    boolean contains(T obj);
    String toString();


}
public class Node<T> {

    private T value;
    private Node<T> next;
    private Node<T> previous;

    public Node() {
        this(null, null, null);
    }

    public Node(T value) {
        this(value, null, null);
    }

    public Node(T value, Node<T> next) {
        this(value, next, null);
    }

    public Node(T value, Node<T> next, Node<T> previous) {
        this.value = value;
        this.next = next;
        this.previous = previous;
    }

    public T getValue() {
        return value;
    }

    public void setValue(T value) {
        this.value = value;
    }

    public void setNext(Node<T> next) {
        this.next = next;
    }

    public Node<T> getNext() {
        return next;
    }

    public Node<T> getPrevious() {
        return previous;
    }

    public void setPrevious(Node<T> previous) {
        this.previous = previous;
    }

}
public class LinkedList<T> implements List<T> {

    private Node<T> list;

    public LinkedList() {
        this.list = null;
    }

    //adicionar objeto
    @Override
    public void add(T obj) {

        Node<T> node = new Node<>(obj);

        if(list == null){
            list = node;
        } else {
            node.setNext(list);
            list = node;
        }

    }

    //adicionar na posicao
    @Override
    public void set(int position, T obj) {

        Node<T> node = list;

        int i=0;
        if(position ==0) 
              while(node.getNext()!=null) {
                  if(i-1==position) {
                      node.getNext().setValue(obj);
                  }

                    node=node.getNext();
                    i++;  
              }
    }

    //remover objeto
    @Override
    public void remove(T obj) {
        //remover

        Node<T> node = list;

        if(node.getValue().equals(obj)){
            list = node.getNext();
            node.setNext(null);
        } else {

            while(node.getNext() != null){

                if(node.getNext().getValue().equals(obj)){
                    break;
                }

                node = node.getNext();

            }

            Node aux = node.getNext();
            node.setNext(aux.getNext());
            aux.setNext(null);

        }

    }

    //remover na posicao
    @Override
    public void remove(int position) {
        //remover na posicao

        Node<T> node = list;

        int i=1;

        while(node.getNext()!=null) {

            if(i-1==position) {
                break;
            }
                node=node.getNext();
                i++;
        }

        Node aux = node.getNext();
        node.setNext(aux.getNext());
        aux.setNext(null);

    }

    //pegar valor da posicao
    @Override
    public T get(int position) {
        //pegar o valor da posicao
        Node<T> node=list;

        int i=1;

        while(node.getNext()!=null) {
            if(i-1==position) {
                break;
            }
            node=node.getNext();
            i++;
        }

        return (T) node.getNext();
    }

    //pegar primeiro valor da lista
    @Override
    public T first() {
        //pegar o primeiro da lista
        return (T) list;
    }

    //pegar ultimo valor da lista
    @Override
    public T last() {
        Node<T> node= list;

        while(node.getNext()!=null) {
            node=node.getNext();
        }
        //ultimo elemento da lista
        return (T)node.getNext();
    }

    //verificar se a lista esta vazia
    @Override
    public boolean isEmpty() {

        if(list==null) 
            return true;
        else
            return false;
    }

    //verificar se contem o objeto na lista
    @Override
    public boolean contains(T obj) {
        //verificar se contem

        Node<T> node=list;
        //retorno funciona como um break, se ele fizer o retorno o laco eh interrompido
        while(node.getNext()!=null) {
            if(node.getNext().getValue().equals(obj)){
                return true;
            }
        }
        return false;
    }

    @Override
    public String toString() {
        int i=list.
    }
}
    
asked by anonymous 24.09.2017 / 18:11

1 answer

1

The problem is really where you imagined it, in the get method of LinkedList. The mistake was as follows:

public T get(int position) {
    //pegar o valor da posicao
    Node<T> node=list;

    int i=1;

    while(node.getNext()!=null) {
        if(i-1==position) {
            break;
        }
        node=node.getNext();
        i++;
    }
    // Aqui você está retornando um nó, não o valor dele.
    // return (T) node.getNext();
    // O correto seria
    return (T) node.getValue();
}

He made the same mistake in the other methods that return values:

//pegar primeiro valor da lista
@Override
public T first() {
    //pegar o primeiro da lista
    return (T) list.getValue();
}

//pegar ultimo valor da lista
@Override
public T last() {
    Node<T> node= list;

    while(node.getNext()!=null) {
        node=node.getNext();
    }
    //ultimo elemento da lista
    return (T)node.getValue();
}

In your contains you also forgot to navigate the nodes, this caused that your contains method would not allow the end of your program.

//verificar se contem o objeto na lista
@Override
public boolean contains(T obj) {
    //verificar se contem

    Node<T> node=list;
    //retorno funciona como um break, se ele fizer o retorno o laco eh interrompido
    while(node.getNext()!=null) {
        if(node.getNext().getValue().equals(obj)){
            return true;
        }
        // Essa linha estava ausente
        node = node.getNext();
    }
    return false;
}

Your add method is putting the values upside down ... Hope it helps.

    
24.09.2017 / 19:49