Hola amigos, tengo este codigo donde utilizo un nodo ubicado en la cabecera(cab) y otro al final(fin).
Quiero saber como puedo mostrar de forma inversa los datos ingresados.
CODIGO:
package metodos;
import javax.swing.JOptionPane;
public class lista {
nodo cab;
nodo fin;
lista(){
cab = fin = null;
}
nodo getNodo(int cod){
nodo p;
if( cab == null )
//lista vacia
return null;
else{
//la lista tiene al menos un nodo
p=cab;
while(p!=null){
if(p.codP == cod)
return p;
else
p=p.sig;
}
return null;
}
}
//creamos el metodo get final
nodo getNodoEnd(int cod){
nodo p;
if( fin == null )
//lista vacia
return null;
else{
//la lista tiene al menos un nodo
p=fin;
while(p!=null){
if(p.codP == cod)
return p;
else
p=p.ant;
}
return null;
}
}
boolean getVacia(){
return cab==null?true:false;
}
int getLonglista(){
if(getVacia())
return 0;
else{
int con=0;
nodo p=cab;
while(p!=null){
con++;
p=p.sig;
}
return con;
}
}
void setAddFinal(nodo info){
nodo p, q;
if( cab == null ){
cab = info;
"Primer elemento agregado!!, la lista tiene 1 elemento.");
}else{
q = getNodo(info.codP);
if(q!=null)
"El código del producto ya esta registrado en la lista!!!");
else{
p=cab;
while(p.sig!=null){
p=p.sig;
}
p.sig = info;
int tam = getLonglista();
"Nuevo elemento agregado al final de la lista,"+
" existen: "+tam+" elementos.");
}
}
}
void getMostrarT(){
if(getVacia())
else{
nodo p=cab;
int con=0;
while(p!=null){
aux = "La información en la posición "+con+" es:\n";
aux += "Código Producto: "+p.codP+"\n";
aux += "Nombre Producto: "+p.nomP+"\n";
aux += "Precio Unitario: "+p.precioU+"\n";
con++;
p=p.sig;
}
}
}
void setElimN( int cod ){
nodo p = getNodo(cod);
if( cab == null ){
"Lista vacía...");
}else{
if(p==null){
JOptionPane.
showMessageDialog(null,
"Elemento no existe!"); }else{
nodo q = null;
if((cab.sig==null)&&( p == cab )){
cab = p = null;
"Elemento eliminado. Lista vacia!!!");
}
else if((cab.sig != null)&&(p == cab)){
cab = p.sig;
p.sig = null;
p = null;
"Elemento eliminado. Eliminado en la cabecera!!!");
}
else if( (p.sig != null)&&(p!=cab) ){
q = cab;
while( q.sig != p )
q = q.sig;
q.sig = p.sig;
p.sig = null;
p = null;
"Elemento eliminado!!!");
}
else{
q = cab;
while( q.sig != p )
q = q.sig;
q.sig = null;
p = null;
"Elemento eliminado de la ultima posicion!!!");
}
}
}
}
}
Clase nodo:
package metodos;
/**
*
* @author Ruben
*/
public class nodo {
int codP;
float precioU;
nodo sig;
nodo ant;
public nodo
(int codP,
String nomP,
float precioU
) { this.codP = codP;
this.nomP = nomP;
this.precioU = precioU;
this.sig = null;
this.ant=null;
}
}
Probador:
package metodos;
import javax.swing.JOptionPane;
public class probador {
public static void main
(String args
[]){ int op, cod;
float precio;
lista productos = new lista();
nodo aux=null;
do{
"Menu Principal \n"+
"1. Agregar Producto \n"+
"2. Mostrar Productos \n"+
"3. Eliminar Producto \n"+
"4. Eliminar elemento de una posicion \n"+
"5. Eliminar elemntos repetidos \n"+
"6. Invertir lista \n"+
"7. Rotar elementos \n"+
"8. Salir \n"+
"Entre su opción: "
));
switch(op){
case 1:
"Entre código del producto: "));
nomp
= JOptionPane.
showInputDialog("Entre nombre producto: "); "Entre precio unitario: "));
aux = new nodo(cod,nomp,precio);
productos.setAddFinal(aux);
break;
case 2:
productos.getMostrarT();
break;
case 3:
"Entre código del producto: "));
productos.setElimN(cod);
break;
case 4:
"Ingrese elemento a borrar: "));
productos.setElimN(cod);
break;
case 5:
break;
case 6:
break;
case 7:
break;
case 8:
break;
default:
JOptionPane.
showMessageDialog(null,
"Opcion invalida!"); }
}while(op!=8);
}
}
Te ubicas en el nodo final y recorres la lista hacia atrás. Acaba cuando llegas a la raíz (o un null, si no usas raíz).
funcion RecorrerHaciaAtras
actual = lista.ultimonodo
hacer mientras actual <> raiz // nulo
mostrar actual.dato
actual = actual.anterior
repetir
fin funcion
Amigo NEBIRE no te entendi, soy nuevo con ese tema
Te ubicas en el nodo final y recorres la lista hacia atrás. Acaba cuando llegas a la raíz (o un null, si no usas raíz).
funcion RecorrerHaciaAtras
actual = lista.ultimonodo
hacer mientras actual <> raiz // nulo
mostrar actual.dato
actual = actual.anterior
repetir
fin funcion
Tu clase Nodo incluye un puntero hacia el Nodo anterior.
Usalos ubicandote primero al final de la lista, que tambien has establecido en tus clases.