package br.com.listas;
//definicao da classe List
public class Lista {
private ListaNo primeiroNo;// Declara variavel de instancia com o nome de PrimeiroNó
private ListaNo ultimoNo;// Declara variavel de instancia com o nome de UltimoNó
private String nome; // String como 'lista' usada na impressao
private int tamanhoLista;
// construtor cria List vazia com 'list' como o nome
public Lista() {
this("Lista");
this.tamanhoLista = 0;
}// fim do construtor sem argumentos List
// construtor cria uma List vazia com um nome
public Lista(String nomeDaLista) {
nome = nomeDaLista;
primeiroNo = ultimoNo = null;
this.tamanhoLista = 0;
}// fim do construtor de um argumento List
// Insere Object na frente de List
public void insereNoInicio(Object insertItem) {
if (estaVazia()) { // first e lastNode referenciam o mesmo objeto
primeiroNo = ultimoNo = new ListaNo(insertItem);
} else {
primeiroNo = new ListaNo(insertItem, primeiroNo);
}// fim do método insereNoInicio
this.tamanhoLista++;
}// fim do método insereNoInicio
// insere Object no fim de Lista
public void insereNoFim(Object insertItem) {
if (estaVazia()) {
primeiroNo = ultimoNo = new ListaNo(insertItem);
} else {
ultimoNo = ultimoNo.proximoNo = new ListaNo(insertItem);
}
this.tamanhoLista++;
}// fim do método insereNoFim
//Insere na posição informada
public void insertAtPosicao(int posicao, Object elemento) {
if(posicao == 0){
insereNoInicio(elemento);
} else if(posicao == this.tamanhoLista){
insereNoFim(elemento);
} else {
if(posicao > 0 && posicao < this.tamanhoLista) {
ListaNo antes = primeiroNo;
for(int i=1; i < posicao; i++) {
antes = antes.getProximoNo();
}
ListaNo novo = new ListaNo(elemento, antes.getProximoNo());
antes.setProximoNo(novo);
this.tamanhoLista++;
}else {
System.out.println("Posição Inválida");
}
}
}
// remove o primeiro nó de List
public Object removeNoInicio() throws EmptyListException {
if (estaVazia()) {
throw new EmptyListException(nome);
}
Object removedItem = primeiroNo.data; // recupera dados sendo removidos
// atualiza referências primeiroNo e ultimoNo
if (primeiroNo == ultimoNo) {
primeiroNo = ultimoNo = null;
} else {
primeiroNo = primeiroNo.proximoNo;
}
this.tamanhoLista--;
return removedItem;// retorna dados de nó removidas
}// fim do método removeNoFim
public Object removeNoFim() throws EmptyListException{
if (estaVazia()){
throw new EmptyListException(nome); //lança excessão se List estiver vazia
}
Object removedItem = ultimoNo.data; //recupera dados sendo removidos
//atualiza referências primeiroNo e ultimoNo
if(primeiroNo == ultimoNo){
primeiroNo = ultimoNo = null;
}
else{ //localiza o novo último nó
ListaNo current = primeiroNo;
//faz loop enquanto nó atual não referencia lastNode
while(current.proximoNo != ultimoNo){
current = current.proximoNo;
}
ultimoNo = current; //atual é novo lastNode
current.proximoNo = null;
}//fim do else
this.tamanhoLista--;
return removedItem; //retorna dados de nó removidos
}//fim do método removeNoFim
public Object removeFromPosicao(int posicao) throws EmptyListException {
Object removedItem = null;
if(posicao == 0){
removeNoInicio();
} else if(posicao == this.tamanhoLista -1){
removeNoFim();
} else {
if(posicao >= 0 && posicao < this.tamanhoLista) {
ListaNo antes = primeiroNo;
for(int i=1; i < posicao; i++) {
antes = antes.getProximoNo();
}
removedItem = antes.getProximoNo().data;
//ATUALIZANDO A ORDEM DA LISTA
ListaNo anterior = antes;
ListaNo itemPosicao = antes.getProximoNo();
ListaNo proximo = itemPosicao.getProximoNo();
anterior.setProximoNo(proximo);
}else {
System.out.println("Posição Inválida");
}
}
this.tamanhoLista--;
return removedItem;
}
public boolean buscaElemento(Object elemento) {
if(elemento == null){
throw new IllegalArgumentException("Elemento não foi informado");
}
ListaNo atual = primeiroNo;
boolean achou = false;
if((atual.data).equals(elemento)) {
return true;
}else {
for (int i = 0; i < tamanhoLista; i++) {
atual = atual.getProximoNo();
if((atual.data).equals(elemento)) {
achou = true;
break;
}
}
}
return achou;
}
// Determina se a lista estiver vazia
public boolean estaVazia() {
return primeiroNo == null; // retorna true se List estiver vazia
}// fim do método estaVazia
// gera saída do conteúdo de List
public void print() {
if (estaVazia()) {
System.out.printf("Lista Vazia %s\n", nome);
System.out.println(imprimeTamanho());
return;
}// fim do if
System.out.printf("A lista %s é: ", nome);
ListaNo current = primeiroNo;
// enquanto não estiver no fim da lista, gera saída dos dados do nó
// atual
while (current != null) {
System.out.printf("%s -> ", current.data);
current = current.proximoNo;
}// fim do While
System.out.printf("\n");
System.out.println(imprimeTamanho());
} // fim do método print
public String imprimeTamanho(){
return "Tamanho da Lista: "+this.tamanhoLista;
}
}// fim da classe List
Como fazer a remoção por valor em uma lista no Java? Desde já agradeço
5 Respostas
Onde esta definição de ListNo?
package br.com.listas;
//classe para representar um n� em uma lista
public class ListaNo {
Object data;
ListaNo proximoNo;
ListaNo(Object object) {
this(object, null);
}// Fim do construtor de um argumento ListaNo
// construtor cria ListaNo que referencia
// Object e o pr�ximo ListaNo
ListaNo(Object object, ListaNo node) {
data = object;
proximoNo = node;
}// fim do construtor de dois argumentos ListaNo
//seta um objeto data
public void setData(Object data){
this.data = data;
}
// retorna refer�ncia aos dados no n�
Object getData() {
return data; // retorna Object nesse n�
}// fim do m�todo getObject
// retorna refer�ncia ao pr�ximo n� na lista
ListaNo getProximoNo() {
return proximoNo; // obt�m pr�ximo n�
}// fim do m�todo getNext
public void setProximoNo(ListaNo novo) {
// TODO Auto-generated method stub
this.proximoNo = novo;
}
}// fim da classe ListaNo
Bem, isso é Estrutura de Dados, no Java isso já vem encapsulado, logo a pessoa pode realizar pilha, fila, lista, etc, sem precisar de aqueles processos todos, usando apenas uma estrutura de conjunto, como ArrayList, Set, dentre outras, de definindo a posição do objeto listado por uma estrutura de repetição, especialmente o for. Já em outras , como o C, C++, isso não ocorre, logo se tem necessidade de saber estrutura de dados pra fazer listas automáticas, usando como princípio básico o ponteiro. Não tem ponteiro em java. Se quiser usar o princípio de lista em Java, é possível mas desnecessário, mas primeiro ache o valor a ser apagado, junte os nós das extremidades, anule os nós da posição específica e depois anule a posição.
Independente disso, vocẽ pode criar suas estruturas próprias, tanto no C, C++ ou java ou qualquer linguagem.
Sobre a questão: você possui o método buscaElemento e possui o método removeFromPosicao. Creio que o buscaElemento deveria retornar um inteiro referente a posição em que encontrou o item. Assim você poderia chamar o removeFromPosicao (por que não removeDaPosicao ou removeFromPosition?).
Seguindo a orientação do @darlan_machado, vc irá conseguir remover. Vc teve alguma dificuldade quando vc tentou remover o elemento?