Lista Duplamente Ligada

Olá,
Estou com uma dúvida sobre Lista Ligada Duplamente ou Lista Duplamente Encadeada, gostaria de saber se na prática (na hora de executar é assim)
procurei na internet e mesmo assim não entendi o conceito.

Obs: se este tópico estiver na seção incorreta, peço que encaminhe para a seção correta, se for o caso.

a seguir o código:

/*Altere a implementao das Listas Ligadas Simples estudadas em aula
para comportar um Lista Duplamente Ligada (ou Lista Duplamente Encadeada)/

class ListaLigada{
No primeiro, ultimo;

ListaLigada (){
	primeiro = null;	
	ultimo = null;
}

public boolean ListaVazia( ){
	if (primeiro == null && ultimo == null)
		return true;
	else
		return false;
}
public void InserirInicio (No novoNo){
	novoNo.prox = primeiro;
	primeiro = novoNo;
	novoNo.ant = ultimo;
	ultimo = novoNo;
}
public void InserirFinal (No novoNo){
	novoNo.prox = null;
	novoNo.ant=null;
	
	if (primeiro == null)
		primeiro = novoNo;
	
	if (ultimo != null)
		ultimo.prox = novoNo;
	    ultimo = novoNo;
	    primeiro.ant = novoNo;
	    primeiro=novoNo;
	 }
public int ContarNos ( ){
	int tamanho = 0;
	No NoTemp = primeiro;
	
	while (NoTemp != null){
		   tamanho = tamanho + 1;
		   NoTemp = NoTemp.prox;
	}
	return tamanho;
}
public void InserirMeio(No NovoNo, int posicao){
	No NoTemp = primeiro;
	int NroNos, PosAux;
	
	NroNos = ContarNos( );
	
	if (posicao == 0){
		NovoNo.prox = primeiro;
		NovoNo.ant = ultimo;
		
		if (primeiro == ultimo)
			ultimo = NovoNo;
		    primeiro = NovoNo;
	}else{
		if (posicao <= NroNos){
			PosAux = 1;
			
			while (NoTemp != null && posicao > PosAux){
				   NoTemp = NoTemp.prox;
			 	   PosAux = PosAux + 1;
			}
			NovoNo.prox = NoTemp.prox;
			NoTemp.prox = NovoNo;
			NoTemp.ant = NovoNo;
		}else
			if (posicao > NroNos){
				ultimo.prox = NovoNo;
				ultimo = NovoNo;
			}
	}
}
public void Remover (int elemento){
	No NoTemp = primeiro;
	if (NoTemp.elemento == elemento){
		primeiro = NoTemp.prox;
		ultimo = NoTemp.ant;
		System.out.println("\nElemento "+elemento+" removido com sucesso \n");
	}
	else{
	
		while (NoTemp.prox != null && NoTemp.prox.elemento != elemento)
			   NoTemp = NoTemp.prox;
			   NoTemp = NoTemp.ant;
			   
		if(NoTemp.prox != null){
			NoTemp.prox = NoTemp.prox.prox;
			if (ultimo == NoTemp.prox)
				ultimo = NoTemp;
				primeiro = NoTemp.ant;
				
			System.out.println("\nElemento "+elemento+" removido com sucesso \n");
		}
		else
			System.out.println("\nElemento "+elemento+" nao encontrado \n");
	}
}
public void ElementoInicio( ){
	System.out.println("O primeiro elemento é " + primeiro.elemento);
}
public void ElementoFinal( ){
	System.out.println("O ultimo elemento é "+ultimo.elemento);
}
public No BuscaNo (int elemento){
	int i = 0;	
	No NoTemp = primeiro;
	
	while (NoTemp != null){
		   if (NoTemp.elemento == elemento){
			   System.out.println("No " + NoTemp.elemento +" posicao " + i);
			    return NoTemp;
		   }
		   i = i + 1;
		   NoTemp = NoTemp.prox;
	}
	return null;
}
public void MostrarLista( ){
	int i = 0;
	No NoTemp = primeiro;
	while (NoTemp != null){
		   System.out.println("Elemento " + NoTemp.elemento +" posicao " + i);
		   NoTemp = NoTemp.prox;
		   i = i + 1;
		   
		   System.out.println("Elemento anterior " + NoTemp.elemento +" posicao " + i);
		   NoTemp = NoTemp.ant;
		   i = i - 1;
	}
	System.out.println("\n");
}

}

//método Main

public static void main (String arg []){
	ListaLigada Lista = new ListaLigada();
	int i;
	int elemento=0;
	No entrada = null;
	String nom="";
	for (i = 1 ; i <= 5 ; i++){
		nom=JOptionPane.showInputDialog(null,"Digite o nome "+i);
		elemento=Integer.parseInt(JOptionPane.showInputDialog("Digite o elemento "+i));
		entrada = new No(nom,elemento);
		              
		Lista.InserirFinal(entrada);
	}

	Lista.MostrarLista();

	entrada = new No(nom,elemento);
	Lista.InserirInicio(entrada);

	Lista.MostrarLista();

	entrada = new No(nom,elemento);
	Lista.InserirFinal(entrada);

	Lista.MostrarLista();

	entrada = new No(nom,elemento);
	Lista.InserirMeio(entrada,4);
	
	Lista.MostrarLista();
	
	Lista.Remover(34);
	
	Lista.MostrarLista();

	System.exit(0);
}