package br.ufsc.listas_encadeadas; public class ListaEncadeadaFinal { private Nodo inicio; private Nodo ultimo; private class Nodo { Integer dado; Nodo proximo; } public ListaEncadeadaFinal() { this.inicio = null; this.ultimo = null; } public void insereInicio(int valor) { Nodo novo = new Nodo(); novo.dado = valor; if(inicio == null) { novo.proximo = inicio; inicio = novo; ultimo = inicio; } else { novo.proximo = inicio; inicio = novo; } } public Integer removeInicio() { if (this.inicio != null) { Nodo retirado = inicio; if (this.inicio == this.ultimo) this.inicio = this.ultimo = null; else inicio = inicio.proximo; Integer retorno = retirado.dado; retirado = null; return retorno; } return null; } public void inserirFinal(Integer valor) { Nodo novo = new Nodo(); novo.dado = valor; novo.proximo = null; if (this.inicio == null) { this.inicio = novo; this.ultimo = novo; } else { this.ultimo.proximo = novo; this.ultimo = novo; } } public Integer retirarUltimo() { if (this.inicio == null) return null; Nodo retirado = this.ultimo; if (this.inicio == this.ultimo) this.inicio = this.ultimo = null; else { Nodo temp = this.inicio; while (temp.proximo != this.ultimo) { temp = temp.proximo; } this.ultimo = temp; temp.proximo = null; } return retirado.dado; } public Integer removeMeio(Integer indice) { Nodo temp = this.inicio; Nodo anterior = null; Nodo depois = null; int i = 0; while (temp != null && i < indice) { anterior = temp; temp = temp.proximo; i++; } if (temp == null) { return null; } if (anterior == null) { Nodo retirado = inicio; inicio = inicio.proximo; Integer retorno = retirado.dado; retirado = null; return retorno; } Nodo retirado = temp; depois = temp.proximo; anterior.proximo = depois; Integer retorno = retirado.dado; retirado = null; return retorno; } public void imprimeLista() { for (Nodo x = this.inicio; x != null; x = x.proximo) { System.out.print(x.dado + " --> "); } System.out.println("null"); } }