Listas ligadas metodo remove do fim duvida

ola tudo bem Friends, gostaria de entender mais este medodo algumas linhas.

package br.com.caelum.ed.listasligadas;

public class ListaLigada {
....................................................

// metodo remove do fim
	public void removeDoFim() {
		// verifica se a ultima posicao existe
		if (!this.posicaoOcupada(totalDeElementos - 1)) {
			throw new IllegalArgumentException("Posicao nao existe");
		}
		// se a lista estiver com apenas um elemento e a mesma coisa que remover
		// do começo
		if (totalDeElementos == 1) {
			this.removeDoComeco();// se o total de elementos for igual a 1 ira
									// remover do começo
			
		} else {
			Celula penultima = this.ultima.getAnterior();
			penultima.setProxima(null);
			this.ultima = penultima;
			totalDeElementos--;
		}

	}

if (!this.posicaoOcupada(totalDeElementos - 1)) nao entendi o total de elementos -1

else {
			Celula penultima = this.ultima.getAnterior();
			penultima.setProxima(null);
			this.ultima = penultima;
			totalDeElementos--;// aqui significa que esta fazendo a remoçao certo ? nao entendi estes metodos do else
public class Celula {
.....................

//para as celulas saber qual e sua anterior
	public Celula getAnterior(){
		return anterior;
	}
	
	public void setAnterior(Celula anterior){
		this.anterior = anterior;
	}

mesma classe estou com esse metodo remove agora que vai remover do meio gostaria que alguem me explicasse a parte do ultimo else vou colocar o metodo inteiro, nao sei se posso aproveitar o mesmo topico pois o metodo e do mesmo exercicio alguem por gentileza pode me explicar.

// metodo remove
	public void remove(int posicao) {
		if (!posicaoOcupada(posicao)) {// verifica se a posicao esta ocupada ou
										// nao, se a posicao nao estiver ocupada
										// lanca uma execao, e significa que
										// esta fazia para remover
			throw new IllegalArgumentException(" Posicao nao existe ");

		}
		if (posicao == 0) {// remove do comeco
			this.removeDoComeco();
		} else if (posicao == this.totalDeElementos - 1) {// o total deelementos
															// que tenho menos 1
															// ele remove do fim
			this.removeDoFim();// remove do fim
		} else {
			Celula anterior = this.pegaCelula(posicao - 1);
			Celula atual = anterior.getProxima();
			Celula proxima = atual.getProxima();

			anterior.setProxima(proxima);
			proxima.setAnterior(anterior);

			totalDeElementos--;
		}

	}
essa e a parte que gostaria de uma explicação
 else {
			Celula anterior = this.pegaCelula(posicao - 1);
			Celula atual = anterior.getProxima();
			Celula proxima = atual.getProxima();

			anterior.setProxima(proxima);
			proxima.setAnterior(anterior);

			totalDeElementos--;
		}

Bom, o correto seria abrir outro tópico, pois o mesmo se refere à dúvida e não à classe… Afinal, uma classe pode ter mais de 5 mil linhas e, várias dúvidas diferentes.

Bom, explicando o else (considere o número da linha que aparece ali):
Eu me recordo de ter visto lista encadeada em C (ANSI) e o professor teimava em fazer desenhos para exemplificar… Resultado? Final em estruturas de dados…

Bom, quando você possui esta estrtutura, lista ligada, ao retirar um elemento, é preciso reordenar de forma que não haja perda na ligação dos nós (ou células, como no exemplo).
Desta forma, você precisa de um nó auxiliar (classe Celula, objeto anterior) que irá determinar qual será o ponto definido como último.
A partir desta definição, é possível determinar qual o anterior (o nó/célula que era o antepenúltimo) e qual o próximo (como foi removido o último, logo, continua sendo o primeiro).

Entendeu?

ok obrigado e valeu pela dica de abrir outro topico, obrigadao mesmo drsmachado bom no caso eu entendi sim, esses exercicios e da apostila caelum, valeu abraço.