Problema: Crear una lista simple enlazada de números enteros, se desea añadir un nodo entre dos nodos consecutivos; el dato del nuevo nodo debe ser la diferencia en valor absoluto de los dos nodos.
Ejemplo si tengo la
siguiente lista
|
20 | | 43 | |
17 | | 4 |
| 11 |
Se dese
insertar un dato entre 43 y 17.
Reviso que
exista la secuencia
Luego
calculo el valor absoluto de (43-17)
Inserto entre esos
elementos.
|
20 | | 43 | |
26 | | 17 | |
4 | | 11 |
Explicación: Se generara un clase lista simple en la cual los nodos tengan como parámetro un valor entero y una referencia al nodo siguiente. En base a esta Lista se generara un método capaz de encontrar un valor dado en este caso por un entero y generar entre dichos nodos un nuevo nodo cuyo dato entero sea el valor absoluto de las diferencia entre estos valores.Para generar dicho método se hará uso de un contado el cual mantenga constancia del numero de nodos en la lista, y se generara el nuevo nodo después del nodo indicado, para el calculo de los valores se usara el método abs de la clase Math.Como dato final se decidió obviar el calculo después del ultimo dato debido a la falta de un segundo dato para el calculo del valor absoluto.
Clase Nodo
public class Nodo {
private Nodo siguiente;
private int info;
public Nodo(int info) {
this.info = info;
}
public Nodo(Nodo siguiente, int info) {
this.siguiente = siguiente;
this.info = info;
}
public Nodo getSiguiente() {
return siguiente;
}
public void setSiguiente(Nodo siguiente) {
this.siguiente = siguiente;
}
public int getInfo() {
return info;
}
public void setInfo(int info) {
this.info = info;
}
}
Clase Lista
public class Lista {
private Nodo inicio;
private Nodo fin;
public Lista(){
inicio=fin=null;
}
public void imprimir(){
Nodo aux=inicio;
int cont=1;
while(aux!=null){
System.out.println(cont+" "+aux.getInfo());
cont++;
aux=aux.getSiguiente();
}
}
public void agregarNodo(int valor){//Funcion basica para agregar un valor al final de un lista simple
Nodo nuevo= new Nodo(valor);
if(fin!=null){
fin.setSiguiente(nuevo);
}else{
inicio=nuevo;
}
fin=nuevo;
}
public void agregarValor(int pos){
int cont=1;
Nodo aux=inicio;
Nodo aux2=inicio.getSiguiente();
if(pos<cont()&&pos>1){//Se controla que el numero ingresado sea valido para la ejecucion de la aplicacion.
while(aux2!=null){//se controla en base a la cual se mas posible llegue a ser un valor nulo
if(cont==pos){//si se encuentra un valor igual al especificado se rompe el ciclo
break;
}
cont++;
aux=aux2;
aux2=aux2.getSiguiente();
}
if(cont==pos&&aux2!=null){//Si los valores son iguales se agrega el valor absoluto entre los dos nodos.
Nodo nuevo=new Nodo(Math.abs(aux.getInfo()-aux2.getInfo()));
aux.setSiguiente(nuevo);
nuevo.setSiguiente(aux2);
}
}
}
public int cont(){//Realiza el calculo del numero total de valores de la lista
Nodo aux=inicio;
int cont=0;
while(aux!=null){
cont++;
aux=aux.getSiguiente();
}
return cont;
}
}
Clase Principal
import java.util.Scanner;
public class Principal {
public static void main(String[] args) {
// TODO Auto-generated method stub
Lista l=new Lista();
int menu=0,aux;
do{
menu=leerInt("----Menu----"
+ "\n0.Salir"
+ "\n1.Agregar Entero a la Lista"
+ "\n2.Imprimir Lista"
+ "\n3.Agregar un valor absoluto despues del Nodo");
switch(menu){
case 0:{
System.out.println("Programa Terminado");
break;
}
case 1:{
l.agregarNodo(leerInt("Ingrese el valor a agregar a la lista"));
break;
}
case 2:{
l.imprimir();
break;
}
case 3:{
aux=leerInt("Ingrese la posicion despues de la cual se agregara el valor absoluto");
if(aux>=l.cont()||aux<1){//Se limita el ingreso para tener dos valores entre los cuales ingresar el nuevo dato
System.out.println("Valor fuera del rango de la lista");
}else{
l.agregarValor(aux);
System.out.println("Valor agregado a la lista");
}
break;
}
}
}while(menu!=0);
}
public static int leerInt(String texto){
Scanner leer= new Scanner(System.in);
System.out.println(texto);
return leer.nextInt();
}
}
No hay comentarios.:
Publicar un comentario