public class Nodos {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
ListaDoblementeEnlazadaDeNodos nodos=new ListaDoblementeEnlazadaDeNodos();
Nodo UnNodo=new Nodo("Arroz", 2000);
nodos.agregarSiguienteNodo(UnNodo);
System.out.println(nodos.toString());
UnNodo=new Nodo("Azucar", 1000);
nodos.agregarSiguienteNodo(UnNodo);
UnNodo=new Nodo("Pan", 800);
nodos.agregarSiguienteNodo(UnNodo);
System.out.println("\n\n\n"+nodos.toString());
}
}
/**
*
* @author Rafael
* Basado en http://codigolibre.weebly.com/blog/listas-simples-en-java
*/
class ListaDoblementeEnlazadaDeNodos {
private Nodo ListaDeNodos=null;
public void eliminarListaDeNodos(){
// Elimina el valor y la referencia a los demas nodos.
ListaDeNodos = null;
// Reinicia el contador de tamaño de la lista a 0.
tamaño = 0;
}
public void removerPorReferencia(Nodo referencia){
// Consulta si el valor de referencia existe en la lista.
if (buscar(referencia)) {
// Consulta si el nodo a eliminar es el pirmero
if (ListaDeNodos.getNombre().equalsIgnoreCase(referencia.getNombre())==true ) {
// El primer nodo apunta al siguiente.
ListaDeNodos = ListaDeNodos.siguiente;
} else{
// Crea ua copia de la lista.
Nodo aux = ListaDeNodos;
// Recorre la lista hasta llegar al nodo anterior
// al de referencia.
while(aux.getNombre().equalsIgnoreCase(referencia.getNombre())!=true){
aux = aux.siguiente;
}
// Guarda el nodo siguiente del nodo a eliminar.
Nodo siguiente = aux.siguiente.siguiente;
// Enlaza el nodo anterior al de eliminar con el
// sguiente despues de el.
aux.siguiente=siguiente;
}
// Disminuye el contador de tamaño de la lista.
tamaño--;
}
}
public void editarPorReferencia(Nodo referencia, Nodo nuevo_nodo){
// Consulta si el valor existe en la lista.
if (buscar(referencia)) {
// Crea ua copia de la lista.
Nodo aux = ListaDeNodos;
// Recorre la lista hasta llegar al nodo de referencia.
while(aux.getNombre().equalsIgnoreCase(referencia.getNombre())==false){
aux = aux.siguiente;
}
// Actualizamos el valor del nodo
aux.setNombre(referencia.getNombre());
aux.setValor(referencia.getValor());
aux.setId(referencia.getId());
}
}
/**
* throw new Exception("Posicion inexistente en la lista."); Se usa para lanzar errores personalizados.
* @param nuevo_nodo
* @return
*/
public Nodo getValor(Nodo nuevo_nodo){
try{
// Crea una copia de la lista.
Nodo aux = ListaDeNodos;
// Recorre la lista hasta la posición ingresada.
if(buscar(nuevo_nodo)==true){
for (int i = 0; i < posicion; i++) {
aux = aux.siguiente;
}
return aux;
}
}catch(Exception e){
}
return new Nodo();
}
/**
* e busca por nombre.
* @param nombre recive un String como parametro.
* @return Retorna el Nodo consultado con datos completos.
*/
public Nodo getValor(String nombre){
try{
Nodo aux = ListaDeNodos;
Nodo nodo_consulta=new Nodo();
nodo_consulta.setNombre(nombre);
if(buscar(nodo_consulta)==true){
for (int i = 0; i < posicion; i++) {
aux = aux.siguiente;
}
return aux;
}
}catch(Exception e){
}
return new Nodo();
}
public boolean estaBacio(){
return ListaDeNodos==null;
}
private int tamaño=0;
public int getTamaño(){
return tamaño;
}
public void agregarSiguienteNodo(Nodo nuevo_nodo){
Nodo nodoTemporal=null;
if(estaBacio()==true){
ListaDeNodos=nuevo_nodo;
}else{
nodoTemporal=ListaDeNodos;
tamaño=0;
while(nodoTemporal.siguiente!=null){
nodoTemporal=nodoTemporal.siguiente;
tamaño++;
}
nuevo_nodo.setId(tamaño);
nodoTemporal.siguiente=nuevo_nodo;
}
}
public void agregarAnterior(Nodo nuevo_nodo){
if (this.estaBacio()==true) {
ListaDeNodos = nuevo_nodo;
} else{
nuevo_nodo.siguiente=ListaDeNodos;
ListaDeNodos = nuevo_nodo;
}
tamaño++;
}
/**
* !estaBacio() si es false lo convierte en true y si es true lo convierte en false.
* @param referencia
* @param nuevo_nodo
*/
public void insertarPorReferencia(Nodo nodo_de_referencia, Nodo nuevo_nodo){
if (estaBacio()==false) {
if (buscar(nodo_de_referencia)) {
Nodo aux = ListaDeNodos;
while (aux.getNombre().equalsIgnoreCase(nodo_de_referencia.getNombre())==false) {
aux = aux.siguiente;
}
Nodo continuacion = aux.siguiente;
aux.siguiente=nuevo_nodo;
nuevo_nodo.siguiente=continuacion;
tamaño++;
}
}
}
private int posicion=0;
public boolean buscar(Nodo referencia){
posicion=0;
Nodo aux = ListaDeNodos;
boolean encontrado = false;
while(aux != null && encontrado != true){
if (referencia.getNombre().equalsIgnoreCase(aux.getNombre()) ==true){
encontrado = true;
return encontrado;//Detiene el recorrido aqui antes que incremente al contador "posicion"
}
else{
aux = aux.siguiente;
}
posicion++;
}
return encontrado;
}
@Override
public String toString(){
Nodo aux = ListaDeNodos;
String informe="Datos de los nodos\n\n\n";
try{
boolean encontrado = false;
while(aux != null && encontrado != true){
informe+=aux.toString() +"\n";
aux = aux.siguiente;
}
}catch(Exception e){
}
return informe;
}
}
/**
*
* @author Rafael
* rafaelangelmfx@gmail.com
*
* celular 506 83942235
*/
class Nodo {
public Nodo anterior=null;
public Nodo siguiente=null;
public Nodo(){
}
public Nodo(Nodo nuevo_anterio, Nodo nuevo_siguiente){
anterior=nuevo_anterio;
siguiente=nuevo_siguiente;
}
public Nodo(Nodo nuevo_anterio, Nodo nuevo_siguiente, int nuevo_id, String nuevo_nombre){
anterior=nuevo_anterio;
siguiente=nuevo_siguiente;
id=nuevo_id;
nombre=nuevo_nombre;
}
public Nodo(String nuevo_nombre, int nuevo_valor){
nombre=nuevo_nombre;
valor=nuevo_valor;
}
private int id=0;
/**
* Sirve para saber el numero de nodo en el que me encuentro.
* @return
*/
public int getId(){
return id;
}
//____________________Datos del nodo_____________________________________
/**
* Sirve para saber el numero de nodo en el que me encuentro.
* @param nuevo_id
*/
public void setId(int nuevo_id){
id=nuevo_id;
}
private int valor=0;
public void setValor(int nuevo_valor){
valor=nuevo_valor;
}
public int getValor(){
return valor;
}
private String nombre="";
public void setNombre(String nuevo_nombre){
nombre=nuevo_nombre;
}
public String getNombre(){
return nombre;
}
/**
* true si es null
* false no es nulo
* @return
*/
public boolean anterior_es_nulo(){
return anterior==null;
}
/**
* true si es null
* false no es nulo
* @return
*/
public boolean siguiente_es_nulo(){
return siguiente==null;
}
@Override
public String toString(){
return "id= " + id + "; nombre= " + nombre + ", valor= " + valor + "; anterior= " +
this.anterior_es_nulo() + "; siguiente= " + this.siguiente_es_nulo();
}
}
La misma tecnica puede modificarse un poco para usarse en colas, pilas y arboles.