Tutorial invertir lista simple en java a travez de nodos by.AmeRiK@nO

Iniciado por Amerikano|Cls, 23 Noviembre 2008, 18:42 PM

0 Miembros y 2 Visitantes están viendo este tema.

Amerikano|Cls

Hola a todos, este es un pequeño tute que explica de forma breve un método que tuve que hacer para la universidad que invierte el orden de una lista sencilla en Java. Bueno empecemos.

El escenario es el siguiente:

Hay una clase Region.java, la cual posee un nombre, una area, una coordenada a travez de una clase Coordenada.java y finalmente una referencia tipo Region hacia la siguiente region para poder tener la lista  ;), hay una clase llamada Colombia.java la cual posee la lista de las Regiones, la cantidad, y la referencia tipo Region hacia la primera:

Clase Coordenada.java packete mundo:

Código (java) [Seleccionar]
package mundo;

import javax.swing.JComponent;

public class Coordenada {

private int x;
private int y;

public Coordenada(int x, int y){
this.x = x;
this.y = y;
}

public int getX(){
return x;
}

public int getY(){
return y;
}
}


La clase Region.java es la siguiente:

Código (java) [Seleccionar]
package mundo;

public class Region {

private String nombre;
private double area;
private Region siguiente;
private Coordenada miCoordenada;

public void setNombre(String nombre){
this.nombre =nombre;
}

public String getNombre(){
return nombre;
}

public void setArea(double area){
this.area =area;
}

public double getArea(){
return area;
}

public void setSiguiente(Region siguiente){
this.siguiente =siguiente;
}

public Region getSiguiente(){
return siguiente;
}

public void setCoordenada(int x, int y){
miCoordenada = new Coordenada(x, y);
}

public Coordenada getCoordenada(){
return miCoordenada;
}
}


Bueno lo unico que tiene esta clase son los metodos usuales setter y getters jeje, ahora miremos como esta la clase Colombia.java:

Código (java) [Seleccionar]

package mundo;

import javax.swing.JOptionPane;

public class Colombia {

Region primera;
int cantidadRegiones;

public Colombia() {
primera = null;
cantidadRegiones =0;
}

public void agregarRegion(String nombre, int x, int y, double area) {

if(buscarRegion(nombre) == null)
{
Region miRegion = new Region();
miRegion.setNombre(nombre);
miRegion.setArea(area);
miRegion.setCoordenada(x, y);
miRegion.setSiguiente(primera);
primera = miRegion;
}
else
JOptionPane.showMessageDialog(null, "Esta region ya fue ingresada");
}

public Region buscarRegion(String nombre)
{
Region miRegion = primera;
while(miRegion !=null)
{
if(miRegion.getNombre().equals(nombre))
return miRegion;
miRegion = miRegion.getSiguiente();
}
return null;
}

public void inicializarColombia() {

agregarRegion("quindio", 10, 20, 230.54);
agregarRegion("valle", 30, 11, 580.32);
agregarRegion("barranquilla", 72, 10, 1520.14);
agregarRegion("bogota", 55, 38, 14554.32);
agregarRegion("pereira", 31, 48, 654.22);
agregarRegion("a", 31, 48, 654.22);
}


public void invertirLista(){

Region miRegion = primera, temp=null;

while(miRegion.getSiguiente() != null)
{
temp = miRegion.getSiguiente();
miRegion.setSiguiente(temp.getSiguiente());
temp.setSiguiente(primera);
primera = temp;
}
}
}


Bueno lo que tiene es un método agregarRegion el cual como ven primero busca en buscarRegion(String nombre) que no haya sido ingresada todavía, y si no esta ingresada la inserta creando una nueva Region y asignandole primera a su referencia siguiente, por lo tanto la primera que se ingrese tendra en siguiente una referencia a null, por ser la última, es decir primera que se ingresa es última que queda jeje.

Bueno, al inicializar la aplicación se llamara al método inicializarColombia() que lo que hace es tan solo agregar unas cuantas regiones, pero no es el caso mostrar la clase principal  :¬¬, ahora viene lo interesante y es el método invertirLista().

Lo que hacemos primeramente es declarar una Región (miRegion) y le apuntamos a Primera para poder empezar desde el inicio :P, y tambien declaramos una referencia (temp) que nos servira para el cambio de nodos.

Como bien, la lista es sencilla por lo tanto no tenemos referencia a Anterior, por eso debemos tener un auxiliar (temp)que nos sirva de rescate.

El bucle lo que hace es mientras no estemos en la ultima región "While(miRegion.getSiguiente() != null)" apuntamos temp hacia la siguiente de donde estamos parados, para que de esta forma al cambiar la referencia en la que estamos hacia la que sigue de la siguiente, en temp nos quede la que saltamos (ahora explico bien el mecanismo usado).

Con "miRegion.setSiguiente(temp.getSiguiente());" lo que hacemos es que donde estamos ponemos en siguiente la referencia siguiente del elemento que saltamos, de esta forma quedaria en la misma posición de temp.

Ahora "temp.setSiguiente(primera);" lo que hace es cambiar la referencia siguiente de temp para que apunte a la primera, y hecho esto ya pasamos nuestro elemento miRegion una posición mas en la lista, y con "primera = temp" indicamos que primera ya no es miRegion sino temp, el esquema siguiente ilustra lo que hace el bucle.


Esquema:

1. Inicio del escenario: Region miRegion = primera, temp=null;


2. Inicializamos temptemp = miRegion.getSiguiente();


3. Saltamos E2: miRegion.setSiguiente(temp.getSiguiente());


4. Apuntamos temp a primera: temp.setSiguiente(primera);


5. Tomamos ya primera como temp: primera = temp;


6. Ahora ordenamos el esquema para que se vea mejor:


Como ven esto se repite hasta que miRegion.getSiguiente() != null, eso indicaria que terminamos, ya que los elementos iran quedando uno detrás del otro y asi sucesivamente.

Espero les sirva de algo, cualquier duda comenten  :xD

salu2

amerikano




Mi blog:
http://amerikanocls.blogspot.com

Amerikano|Cls

mmmmmmmm pocos comentarios, me parece trizte que lo vean mas de 11 veces y nadie se anime ni agradecer :( que mal, pero bueno.

salu2




Mi blog:
http://amerikanocls.blogspot.com

juancho77

jeje yo lo mire pero es lo mismo que vi en la universidad el cuatrimestre pasado. Igual esta muy bueno.  ;)
Saludos!

Amerikano|Cls

yo estoy en tercero y lo vimos hace poco, ahora estamos viendo arboles y herencia y terminamos semestre jeje  :rolleyes:

salu2




Mi blog:
http://amerikanocls.blogspot.com

sant0s

hola, come estas espero que bien.

interesante tu codigo de invertir lista.

si fueras tan amable de traducir el codigo al lenguaje delphi. te lo agradecería
o caso contrario una breve explicacion de lo que hacen estas dos lineas de codigo.

miRegion.setSiguiente(temp.getSiguiente());
temp.setSiguiente(primera);

[Case]

Cita de: Amerikano|Cls en 24 Noviembre 2008, 04:49 AM
yo estoy en tercero y lo vimos hace poco, ahora estamos viendo arboles y herencia y terminamos semestre jeje  :rolleyes:

salu2

Que estas estudiando?.

sant0s

estudio informatica, si te refiers a que estructura: lista simple, lista doble, pilas, colas y conjunto.
gracias por  responder, espero puedas traducirlo al delphi solo la parte de invertir por lo demas yo me ago cargo.
Gracias de Antemano.