Here is a fairly smooth example of implementing a double-chained list in Java:
Class No:
package teste;
public class No {
private No ant, prox;
private Filme filme;
public No(No ant, No prox, Filme filme) {
this.ant = ant;
this.prox = prox;
this.filme = filme;
}
public No getAnt() {
return ant;
}
public void setAnt(No ant) {
this.ant = ant;
}
public No getProx() {
return prox;
}
public void setProx(No prox) {
this.prox = prox;
}
public Filme getFilme() {
return filme;
}
public void setFilme(Filme filme) {
this.filme = filme;
}
}
Movie Class
package teste;
import java.util.Date;
public class Filme {
private String nomeFilme;
private Date dataLancamento;
public String getNomeFilme() {
return nomeFilme;
}
public void setNomeFilme(String nomeFilme) {
this.nomeFilme = nomeFilme;
}
public Date getDataLancamento() {
return dataLancamento;
}
public void setDataLancamento(Date dataLancamento) {
this.dataLancamento = dataLancamento;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((dataLancamento == null) ? 0 : dataLancamento.hashCode());
result = prime * result + ((nomeFilme == null) ? 0 : nomeFilme.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Filme other = (Filme) obj;
if (dataLancamento == null) {
if (other.dataLancamento != null)
return false;
} else if (!dataLancamento.equals(other.dataLancamento))
return false;
if (nomeFilme == null) {
if (other.nomeFilme != null)
return false;
} else if (!nomeFilme.equals(other.nomeFilme))
return false;
return true;
}
@Override
public String toString() {
return "Filme [nomeFilme=" + nomeFilme + ", dataLancamento=" + dataLancamento + "]";
}
}
Class List
package teste;
public class Lista {
/*
* Aqui criamos 2 variaveis do tipo No para não perdermos a nossa lista
* imagine a lista como um varal… e os nós como roupas… o ant e prox do nó
* será nossos pregadores e os bambus que seguram o varal são as variaveis
* inicio e fim… se essas variaveis perderem seu valor é como se soltasse o
* fio do varal… continuaremos a ter 2 bambus mas não teremos mais o varal…
*/
private No inicio;
private No fim;
// construtor
public Lista() {
inicializa();
// chama inicializa para economizar codigo
}
public void inicializa() {
inicio = null;
fim = null;
// inicializa faz a lista ficar vazia
}
/*
* ai vem a famoza pergunta…se eu tenho uma lista cheia e pego meu inicio e
* fim e seto eles para que a lista esteja vazia.. e meus nós que ja
* instanciei??? Bom quando um objeto no java (no caso o nó) perde sua
* referencia (no caso o inicio e fim) o próprio java retira da memória o
* que está sobrando quem faz isso é o Garbage Collector… ou como preferir…
* coletor de lixo
*/
// aqui fazemos uma lista para inserir somente no final
public void insereNoFim(Filme filme) {
// declaramos e instanciamos a variavel caixa
// do tipo nó. seu anterior vai ser o fim
// pois estamos inserindo depois do fim
No caixa = new No(inicio, null, filme);
if (inicio == null)// se lista estiver vazia
inicio = fim = caixa;
else {
// seta prox do No do fim para receber caixa
fim.setProx(caixa);
fim = caixa;
}
}
// aqui fazemos uma lista para inserir somente no comeco
public void insereNoComeco(Filme filme) {
// declaramos e instanciamos a variavel caixa
// do tipo nó. seu proximo vai ser o incio
// pois estamos inserindo antes do inicio
No caixa = new No(null, inicio, filme);
if (inicio == null)// se lista estiver vazia
inicio = fim = caixa;
else {
// seta ant do No do inicio para receber caixa
inicio.setAnt(caixa);
inicio = caixa;
}
}
public void exibeLista() {
No aux;
aux = inicio;
while (aux != null) {
System.out.println(aux.getFilme());
aux = aux.getProx();
}
}
public No Busca_Exaustiva(Filme elemento) {
No p = inicio;
while ((p != null) && (p.getFilme() != elemento)) {
p = p.getProx();
}
if ((p != null) && (p.getFilme() == elemento))
return p;
else
return null;
}
// no remove temos 5 casos a considerar
public void removeLista(Filme elemento) {
No pos;
pos = Busca_Exaustiva(elemento);
if (pos != null)// 1- se existe o No a ser deletado
{
if (inicio != fim)// 2- se só existe um Nó na lista
{
if (pos == inicio)// 3- se o Nó esta no começo
{
inicio = pos.getProx();
pos.getProx().setAnt(null);
} else if (pos == fim)// 4- se o Nó esta no fim
{
fim = pos.getAnt();
pos.getAnt().setProx(null);
} else// 5- se o no esta no meio
{
pos.getAnt().setProx(pos.getProx());
pos.getProx().setAnt(pos.getAnt());
}
pos.setAnt(null);
pos.setProx(null);
} else {
inicio = null;
fim = null;
}
} else
System.out.println("Elemento nao encontrado");
}
}
Application Class
package teste;
import java.util.Date;
public class Aplicacao {
Lista lista;
public Aplicacao() {
lista = new Lista();
}
public void executa() {
for (int i = 1; i <= 5; i++) {
Filme filme = new Filme();
filme.setDataLancamento(new Date());
filme.setNomeFilme("Matrix " + i);
lista.insereNoFim(filme);
System.out.println("Lista inserindo no final");
lista.exibeLista();
System.out.println("\n\n");
}
Filme filme = new Filme();
filme.setDataLancamento(new Date());
filme.setNomeFilme("Guerra Civil ");
System.out.println("Lista inserindo no inicio ");
lista.insereNoComeco(filme);
lista.exibeLista();
// Removendo alguns elementos
lista.removeLista(filme);
// Lista após remover alguns dos elementos (30,1,5)
System.out.println("\n\nDepois de Remover os elementos");
lista.exibeLista();
}
public static void main(String args[]) {
Aplicacao a = new Aplicacao();
a.executa();
}
}