1. Na lista simplesmente encadeada recursiva, implemente o método de remover o último elemento da lista.
public class RecursiveSingleLinkedListImpl<T> implements LinkedList<T> {
    protected T data;
    protected RecursiveSingleLinkedListImpl<T> next;
    public RecursiveSingleLinkedListImpl() { }
    public void removeLast(){
    }
}

Passo 1

O enunciado pede para implementar, de forma recursiva, o método removeLast que exclui o último elemento de uma lista simplesmente encadeada. Aqui usamos a convenção de que uma lista “vazia” tem data == null. Vamos precisar identificar três casos: lista vazia, lista com um único elemento e lista com dois ou mais elementos.

Passo 2

Tratar o caso em que a lista já está vazia. Se data == null, não há nada a remover, então simplesmente retornamos sem fazer nada.

Passo 3

Tratar o caso em que há só um elemento na lista. Isso ocorre quando data != null (lista não vazia) e next == null ou next.data == null (não há outro elemento válido após este). Nesse caso, basta “esvaziar” este nó, atribuindo data = null e next = null.

Passo 4

Tratar o caso geral com dois ou mais elementos. Se chegamos aqui, significa que existe pelo menos um próximo nó com valor. Então delegamos a remoção do último elemento para a sublista começando em next, chamando next.removeLast() recursivamente.

Passo 5

Implementar o método conforme o descrito:
public void removeLast() {
 // 1) lista vazia: nada a fazer
 if (this.data \(==\) null) {
 return;
 }
 // 2) único elemento: esvazia este nó
 if (this.next \(==\) null || this.next.data \(==\) null) {
 this.data = null;
 this.next = null;
 return;
 }
 // 3) dois ou mais elementos: remove recursivamente na sublista
 this.next.removeLast();
}

Resposta

public void removeLast() {
 if (this.data \(==\) null) {
 return;
 }
 if (this.next \(==\) null || this.next.data \(==\) null) {
 this.data = null;
 this.next = null;
 return;
 }
 this.next.removeLast();
}

Exercícios relacionados