Lista Circular

olá, estou tentando fazer um código de inserção no final de uma lista simplesmente encadeada circular, só que quando eu tento exibir a sequencia de números que eu inserir esta saindo 5,8,7,6 sendo que eu quero que ele saia 5,6,7,8 .
gostaria de saber qual o erro que estou cometendo ?

(menu)

public class Testa {

public static void main(String[] args) {

    LSEC<Integer> num = new LSEC();
 


    System.out.println("");
    num.inserirNoFinal(5);
    num.inserirNoFinal(6);
    num.inserirNoFinal(7);
    num.inserirNoFinal(8);
    num.exibirTodos();


}

}

public boolean isEmpty() {
    if (this.inicio == null) { // ou if (this.qtd == 0)
        return true;
    } else {
        return false;
    }
}

public void inserirNoFinal(T obj) {
LSENode novo = new LSENode(obj);

    if (this.isEmpty() == true) {
        this.fim = novo;
        this.inicio = novo;
        this.qtd = 1;
        this.inicio.setProx(this.fim); 
    } else {
        novo.setProx(this.fim);
        this.fim = novo;
        this.qtd++;
        this.inicio.setProx(this.fim);
    }
}
public void exibirTodos() {
    LSENode<T> aux;
    if (this.isEmpty() == true) {
        System.out.println("Lista vazia");
    } else {
        aux = this.inicio;
        do {
            System.out.print(aux.getInfo() + " ");
            aux = aux.getProx();
        } while (aux != this.inicio);
    }
}

Posta os fontes das classes LSEC e LSENode.

Qualquer coisa, também tenho um exemplo de lista circular:

import java.util.Arrays;

@SuppressWarnings("unchecked")
public class CircularBuffer<T> {

    private int direction = +1;
    private int index;
    private int size;

    private final Object[] elements;

    public CircularBuffer(int capacity) {
        elements = new Object[capacity];
        index = capacity - 1;
    }

    public CircularBuffer<T> add(T element) {
        next();
        elements[index] = element;
        size++;
        size=Math.min(size, elements.length);
        return this;
    }
    
    @Override
    public boolean equals(Object obj) {
        if (obj instanceof CircularBuffer<?>) {
            CircularBuffer<?> that = (CircularBuffer<?>) obj;
            return Arrays.equals(this.elements, that.elements);
        }
        return false;
    }
    
    public T get(int index) {
        return (T) elements[index];
    }

    @Override
    public int hashCode() {
        return Arrays.hashCode(elements);
    }

    public CircularBuffer<T> left() {
        direction = -1;
        return this; 
    }

    public T remove(T element) {
        for (int i = 0; i < elements.length; i++) {
            if (element.equals(elements[i])) {
                return removeAt(i);
            }
        }
        return null;
    }

    public T removeAt(int index) {
        T object = (T) elements[index];
        elements[index] = null;
        size--;
        previous();
        return object;
    }

    public CircularBuffer<T> right() {
        direction = +1;
        return this; 
    }

    public int size() {
        return size;
    }

    @Override
    public String toString() {
        return getClass().getSimpleName() + " (" + size() + " / " + elements.length + ") " + Arrays.toString(elements).replace("null", "");
    }

    private void next() {
        index = (index + elements.length + direction) % elements.length;
    }
    
    private void previous() {
        direction *= -1;
        next();
        direction *= -1;
    }
}

Programa para exemplificar o uso:

public class Exemplo {

    public static void main(String[] args) {
        CircularBuffer<Integer> circularBuffer = new CircularBuffer<Integer>(10);

        System.out.println("vazio");
        System.out.println(circularBuffer);
        System.out.println();

        System.out.println("adicionando itens à direita");
        circularBuffer.right();
        System.out.println(circularBuffer.add(1));
        System.out.println(circularBuffer.add(2));
        System.out.println(circularBuffer.add(3));
        System.out.println(circularBuffer.add(4));
        System.out.println(circularBuffer.add(5));
        System.out.println(circularBuffer.add(6));
        System.out.println(circularBuffer.add(7));
        System.out.println(circularBuffer.add(8));
        System.out.println(circularBuffer.add(9));
        System.out.println(circularBuffer.add(10));
        System.out.println(circularBuffer.add(11));
        System.out.println(circularBuffer.add(12));
        System.out.println(circularBuffer.add(13));
        System.out.println(circularBuffer.add(14));
        System.out.println(circularBuffer.add(15));
        System.out.println();

        System.out.println("adicionando itens à esquerda");
        circularBuffer.left();
        System.out.println(circularBuffer.add(16));
        System.out.println(circularBuffer.add(17));
        System.out.println(circularBuffer.add(18));
        System.out.println(circularBuffer.add(19));
        System.out.println(circularBuffer.add(20));
        System.out.println(circularBuffer.add(21));
        System.out.println(circularBuffer.add(22));
        System.out.println(circularBuffer.add(23));
        System.out.println(circularBuffer.add(24));
        System.out.println(circularBuffer.add(25));
        System.out.println();

        System.out.println("removendo itens");
        circularBuffer.remove(16);
        System.out.println(circularBuffer);
        circularBuffer.remove(17);
        System.out.println(circularBuffer);
        circularBuffer.remove(18);
        System.out.println(circularBuffer);
        circularBuffer.remove(19);
        System.out.println(circularBuffer);
        circularBuffer.remove(20);
        System.out.println(circularBuffer);
        circularBuffer.remove(21);
        System.out.println(circularBuffer);
        circularBuffer.remove(22);
        System.out.println(circularBuffer);
        circularBuffer.remove(23);
        System.out.println(circularBuffer);
        circularBuffer.remove(24);
        System.out.println(circularBuffer);
        circularBuffer.remove(25);
        System.out.println(circularBuffer);
    }
}

Saída do programa:

vazio
CircularBuffer (0 / 10) [, , , , , , , , , ]

adicionando itens à direita
CircularBuffer (1 / 10) [1, , , , , , , , , ]
CircularBuffer (2 / 10) [1, 2, , , , , , , , ]
CircularBuffer (3 / 10) [1, 2, 3, , , , , , , ]
CircularBuffer (4 / 10) [1, 2, 3, 4, , , , , , ]
CircularBuffer (5 / 10) [1, 2, 3, 4, 5, , , , , ]
CircularBuffer (6 / 10) [1, 2, 3, 4, 5, 6, , , , ]
CircularBuffer (7 / 10) [1, 2, 3, 4, 5, 6, 7, , , ]
CircularBuffer (8 / 10) [1, 2, 3, 4, 5, 6, 7, 8, , ]
CircularBuffer (9 / 10) [1, 2, 3, 4, 5, 6, 7, 8, 9, ]
CircularBuffer (10 / 10) [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
CircularBuffer (10 / 10) [11, 2, 3, 4, 5, 6, 7, 8, 9, 10]
CircularBuffer (10 / 10) [11, 12, 3, 4, 5, 6, 7, 8, 9, 10]
CircularBuffer (10 / 10) [11, 12, 13, 4, 5, 6, 7, 8, 9, 10]
CircularBuffer (10 / 10) [11, 12, 13, 14, 5, 6, 7, 8, 9, 10]
CircularBuffer (10 / 10) [11, 12, 13, 14, 15, 6, 7, 8, 9, 10]

adicionando itens à esquerda
CircularBuffer (10 / 10) [11, 12, 13, 16, 15, 6, 7, 8, 9, 10]
CircularBuffer (10 / 10) [11, 12, 17, 16, 15, 6, 7, 8, 9, 10]
CircularBuffer (10 / 10) [11, 18, 17, 16, 15, 6, 7, 8, 9, 10]
CircularBuffer (10 / 10) [19, 18, 17, 16, 15, 6, 7, 8, 9, 10]
CircularBuffer (10 / 10) [19, 18, 17, 16, 15, 6, 7, 8, 9, 20]
CircularBuffer (10 / 10) [19, 18, 17, 16, 15, 6, 7, 8, 21, 20]
CircularBuffer (10 / 10) [19, 18, 17, 16, 15, 6, 7, 22, 21, 20]
CircularBuffer (10 / 10) [19, 18, 17, 16, 15, 6, 23, 22, 21, 20]
CircularBuffer (10 / 10) [19, 18, 17, 16, 15, 24, 23, 22, 21, 20]
CircularBuffer (10 / 10) [19, 18, 17, 16, 25, 24, 23, 22, 21, 20]

removendo itens
CircularBuffer (9 / 10) [19, 18, 17, , 25, 24, 23, 22, 21, 20]
CircularBuffer (8 / 10) [19, 18, , , 25, 24, 23, 22, 21, 20]
CircularBuffer (7 / 10) [19, , , , 25, 24, 23, 22, 21, 20]
CircularBuffer (6 / 10) [, , , , 25, 24, 23, 22, 21, 20]
CircularBuffer (5 / 10) [, , , , 25, 24, 23, 22, 21, ]
CircularBuffer (4 / 10) [, , , , 25, 24, 23, 22, , ]
CircularBuffer (3 / 10) [, , , , 25, 24, 23, , , ]
CircularBuffer (2 / 10) [, , , , 25, 24, , , , ]
CircularBuffer (1 / 10) [, , , , 25, , , , , ]
CircularBuffer (0 / 10) [, , , , , , , , , ]

classe LSENode

public class LSENode<T extends Comparable> {

private T info;
private LSENode<T> prox;
private LSENode<T> ant;

LSENode(T obj) {
    this.info = obj;
}

public LSENode<T> getAnt() {
    return ant;
}

public void setAnt(LSENode<T> ant) {
    this.ant = ant;
}




void setInfo(T obj) {
    this.info = obj;
}

T getInfo() {
    return this.info;
}

void setProx(LSENode<T> prox) {
    this.prox = prox;
}

LSENode<T> getProx() {
    return this.prox;
}

}

LSEC

public class LSEC<T extends Comparable> {

private LSENode<T> inicio;
private LSENode<T> fim;
private int qtd;

public boolean isEmpty() {
    return this.inicio == null; // ou if (this.qtd == 0)
}



public void inserirNoFinal(T obj) {
    LSENode<T> novo = new LSENode(obj);

    if (this.isEmpty() == true) {
        this.fim = novo;
        this.inicio = novo;
        this.qtd = 1;
        this.inicio.setProx(this.fim);
    } else {
        novo.setProx(this.fim);
        this.fim = novo;
        this.qtd++;
        this.inicio.setProx(this.fim);
    }
}
public void exibirTodos() {
    LSENode<T> aux;
    if (this.isEmpty() == true) {
        System.out.println("Lista vazia");
    } else {
        aux = this.inicio;
        do {
            System.out.print(aux.getInfo() + " ");
            aux = aux.getProx();
        } while (aux != this.inicio);
    }
}

}

Perfeito, foram só alguns errinhos de lógica na sua LSEC.

Eu dei uma refatorada no seu código, veja:

Classe LSENode:

final class LSENode<T extends Comparable<?>> {

    protected T valor;
    protected LSENode<T> proximo;
    protected LSENode<T> anterior;

    protected LSENode(T valor) {
        this.valor = valor;
    }

    @Override
    public String toString() {
        return String.valueOf(valor);
    }
}

Classe LSEC:

public final class LSEC<T extends Comparable<?>> {

    private LSENode<T> inicio;
    private LSENode<T> fim;
    private int qtd;

    public boolean vazia() {
        return this.inicio == null;
    }

    public void inserirNoFinal(T valor) {
        LSENode<T> novo = new LSENode<>(valor);
        if (vazia()) {
            fim = novo;
            inicio = novo;
        } else {
            fim.proximo = novo;
            novo.anterior = fim;
            fim = novo;
        }
        qtd++;
    }

    public void inserirNoInicio(T valor) {
        LSENode<T> novo = new LSENode<>(valor);
        if (vazia()) {
            fim = novo;
            inicio = novo;
        } else {
            inicio.anterior = novo;
            novo.proximo = inicio;
            inicio = novo;
        }
        qtd++;
    }

    public void exibirTodos() {
        System.out.println(vazia() ? "Lista vazia" : this);
    }

    @Override
    public String toString() {
        StringBuilder texto = new StringBuilder();
        for (LSENode<T> aux = this.inicio; aux != null; aux = aux.proximo) {
            texto.append(aux.valor).append(" ");
        }
        return texto.toString().trim();
    }
}

Classe Testa:

public class Testa {

    public static void main(String[] args) {
        LSEC<Integer> num = new LSEC<>();

        num.inserirNoFinal(5);
        num.inserirNoFinal(6);
        num.inserirNoFinal(7);
        num.inserirNoFinal(8);
        num.exibirTodos();

        num.inserirNoInicio(4);
        num.inserirNoInicio(3);
        num.inserirNoInicio(2);
        num.inserirNoInicio(1);
        num.exibirTodos();
    }
}

vlw , consegui entender meu erro agora

1 curtida