Lista encadeada de objetos, não consigo remover no final

8 respostas
M

Olá pessoal, o professor passou um algoritmo de uma lista que insere elementos no final da lista e remove no início(ou seja, uma fila), mas agora ele quer que a gente insira um método que remova no final. Eu entendo a lógica, tenho que percorrer até o ultimo elemento e apontá-lo como null, mas não estou conseguindo passar isto pro código, ele disse que não é pra usar array, que quer que façamos tudo no "braço" mesmo...
Segue abaixo os códigos:

public class Lista {
      private Pessoa primeiro;
      public Lista(){
    	  this.primeiro = null;
      }
      public void inserir(Pessoa pessoa){
    	  if(this.primeiro == null)
    		  this.primeiro = pessoa;
    	  else{
    		  Pessoa iterador;
    		  iterador = this.primeiro;
    		  for(; iterador.getProximo()!= null; iterador = iterador.getProximo());
    		  iterador.setProximo(pessoa);
    	  }
      }
      public void remover(){
    	  if(this.primeiro != null){
    		  this.primeiro = this.primeiro.getProximo();
    	  }
      }
      public void removerNoFinal(){
    	  Pessoa iterador;
    	  if(this.primeiro!= null){
    	      iterador = this.primeiro;
    	      for(; iterador.getProximo()!= null; iterador = iterador.getProximo()); // vai até o ultimo elemento
    	      iterador = null; // elemina o ultimo elemento
    	  }
    	  
      }
	public Pessoa getPrimeiro() {
		return primeiro;
	}
	public void setPrimeiro(Pessoa primeiro) {
		this.primeiro = primeiro;
	}
      
}
public class Pessoa {
    private Pessoa proximo;
    private String nome;
    public Pessoa(){
    	this.proximo = null;
    	this.nome = "";
    }
	public Pessoa getProximo() {
		return proximo;
	}
	public void setProximo(Pessoa proximo) {
		this.proximo = proximo;
	}
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	public String toString(){
		return this.getNome();
	}

}
import java.util.Scanner;
public class Principal {
   public static void main(String args[]){
	   Scanner input = new Scanner(System.in);
	   Lista StudentsGold = new Lista();
	   Pessoa iterador;
	   int op;
	   do{
		   
		   System.out.println("Digite 1 para inserir uma pessoa na lista");
		   System.out.println("Digite 2 para remover uma pessoa no inicio da lista");
		   System.out.println("Digite 3 para remover uma pessoa no final da lista");
		   System.out.println("Digite 4 para mostrar a lista na tela");
		   System.out.println("Digite 0 para sair");
		   op = input.nextInt();
		   switch(op){
		   
		   case 4:
			   {
				   if(StudentsGold.getPrimeiro()!= null){
				     for(iterador = StudentsGold.getPrimeiro(); iterador.getProximo()!= null;iterador = iterador.getProximo())
				     System.out.println(iterador);
				     System.out.println(iterador);
				   }
				     else 
				    	 System.out.println("Lista Vazia");
				   break;
				  }
			   
		   case 2:{
			   StudentsGold.remover();
			   break;
		   }
		   case 1:
		   {
			   System.out.println("Digite o nome do Aluno");
			   iterador = new Pessoa();
			   iterador.setNome(input.next());
			   StudentsGold.inserir(iterador);
			   break;
		   }
		   case 3:{
			   StudentsGold.removerNoFinal();
			   break;
		   }
			   
		}
	   }while(op!=0);
   }
}

Não estou conseguindo remover o último elemento :cry:

8 Respostas

alucardeck
public void removerNoFinal(){  
         Pessoa iterador;  
          if(this.primeiro!= null){  
              iterador = this.primeiro;  
              for(; iterador.getProximo()!= null; iterador = iterador.getProximo()); // vai até o ultimo elemento  
              iterador = null; // elemina o ultimo elemento  
        }  
           
     }

esse metodo nao esta fazendo nada na verdade...

o correto para quebrar a 'corrente'
é ir no penultimo da fila... e dar null no atributo 'proximo' dele..

automaticamente o ultimo da fila vai se perder de qualquer referencia, e o GC vai eliminar a existencia dele...

M

Entendi o que você quis dizer, meu pensamento é este, quando o próximo for o ultimo elemento, ou seja, quando o próximo do próximo for null, próximo = null. Mas não estou conseguindo fazer isso :cry:

alucardeck
for(; iterador.getProximo().getProximo() != null ; iterador=iterador.getProximo()){
     iterador.setProximo(null);
}

vc pode dar getProximo().getProximo() para pegar o ‘proximo do proximo’ e verificar se está nulo,
já que getProximo() retorna um objeto do tipo Pessoa…

talvez estoure um erro se a fila estiver pequena… ai vc corrige =]

T

Acho que esse não é o melhor jeito. Mas, adaptando a tua solução, acho que vc poderia fazer o for assim…

for(; iterador.getProximo()!= null; iterador = iterador.getProximo()){
    if(iterador.getProximo()==null){
        iterador = null;
        break;
    }
}
alucardeck

thiago_vf:
Acho que esse não é o melhor jeito. Mas, adaptando a tua solução, acho que vc poderia fazer o for assim…

for(; iterador.getProximo()!= null; iterador = iterador.getProximo()){
    if(iterador.getProximo()==null){
        iterador = null;
        break;
    }
}

nesta sua solução ainda não daria certo…

iterador aponta apenas para um endereço de memoria de variavel ‘local’… dar nulo nele, é apenas apagar a referencia da variavel local…

para quebrar a corrente, vc precisar apagar a referencia que esta dentro do objeto Pessoa…
no caso iterator.setProximo(null)

T

tem razão.
e não iria funcionar nunca esse for junto com esse if!

hehe … foi malz ae!

M

Seria mais ou menos assim? [Desculpa é que to com muita dificuldade, to tentando fazer aqui)

public void removerNoFinal(){
		Pessoa iterador;
		iterador = this.primeiro;
		  for(; iterador.getProximo()!= null; iterador = iterador.getProximo()){
			  if(iterador.getProximo().getProximo()==null){
				  iterador.setProximo(null);
			  }
		  }
	}

Tentei assim mas ta dando erro de NullPointerExcepetion, então o objeto está ficando vazio né?

M

AH, consegui pessoal, muito obrigado a todos vocês pela força, agora eu compreendi muito bem. Um abraço!

public void removerNoFinal(){
		Pessoa iterador;
		iterador = this.primeiro;
		  for(; iterador.getProximo()!= null; iterador = iterador.getProximo()){
			  if(iterador.getProximo().getProximo()==null){
				  iterador.setProximo(null);
				  break;
			  }
		  }
	}
Criado 17 de março de 2011
Ultima resposta 17 de mar. de 2011
Respostas 8
Participantes 3