miércoles, 15 de febrero de 2017

LISTAS SIMPLES 

Las listas son estructuras de datos que permiten tener cierta flexibilidad en su manejo, pueden crecer o acortarse según se lo requiera, existen varias formas de implementar una lista en Java en este caso se presenta un ejemplo en código utilizando punteros mediante la referencia a objetos.

Las listas básicamente se forman del enlace de nodos los cuales funcionan como contenedores para almacenar el valor y enlace al siguiente nodo.

ESTRUCTURA DE UN NODO

Valor: valor del dato a guardar.
Enlace: apunta a la dirección en memoria del siguiente nodo.

LISTA SIMPLEMENTE ENLAZADA:




Características:

1) El último nodo de la lista no apunta a ningún a ninguno (null).
2) Se accede a la lista mediante el primer nodo o también llamado inicio de la lista.
3) No tiene acceso aleatorio es decir para acceder a un valor se debe recorrer toda la lista.

Ejemplo :

CLASE NODO

package Trabajo;

/**
 *
 * @author Jhon
 */
public class nodo {
    
    private int valor;
    
    private nodo siguiente;
   
    public void nodo(){
        this.valor = 0;
        this.siguiente = null;
    }
    
        
    public int getValor() {
        return valor;
    }

    public void setValor(int valor) {
        this.valor = valor;
    }

    public nodo getSiguiente() {
        return siguiente;
    }

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

CLASE LISTA

package Trabajo;
/**
 *
 * @author Jhon
 */
public class Lista {
     
    private nodo inicio;    
    private int tamanio;
    
    
    public void Lista(){
        inicio = null;
        tamanio = 0;
    }
   
    public boolean esVacia(){
        return inicio == null;
    }    
    public int getTamanio(){
        return tamanio;
    }
    
    public void agregarAlFinal(int valor){        
        nodo nuevo = new nodo();        
        nuevo.setValor(valor);        
        if (esVacia()) {           
            inicio = nuevo;        
        } else{           
            nodo aux = inicio;          
            while(aux.getSiguiente() != null){
                aux = aux.getSiguiente();
            }           
            aux.setSiguiente(nuevo);
        }        
        tamanio++;
    }
    
    
    public void agregarAlInicio(int valor){       
        nodo nuevo = new nodo();       
        nuevo.setValor(valor);
       
        if (esVacia()) {           
            inicio = nuevo;      
        } else{           
            nuevo.setSiguiente(inicio);            
            inicio = nuevo;
        }        
        tamanio++;
    }
    
    
    public void insertarPorReferencia(int referencia, int valor){        
        nodo nuevo = new nodo();       
        nuevo.setValor(valor);
       
        if (!esVacia()) {           
            if (buscar(referencia)) {                
                nodo aux = inicio;                
                while (aux.getValor() != referencia) {
                    aux = aux.getSiguiente();
                }                
                nodo siguiente = aux.getSiguiente();                
                aux.setSiguiente(nuevo);               
                nuevo.setSiguiente(siguiente);  
                
                tamanio++;
            }
        }
    }
   
    
    public void insrtarPorPosicion(int posicion, int valor){        
        if(posicion>=0 && posicion<=tamanio){
            nodo nuevo = new nodo();
            nuevo.setValor(valor);           
            if(posicion == 0){                
                nuevo.setSiguiente(inicio);
                inicio = nuevo;
            }
            else{                
                if(posicion == tamanio){
                    nodo aux = inicio;                   
                    while(aux.getSiguiente() != null){
                        aux = aux.getSiguiente();
                    }                   
                    aux.setSiguiente(nuevo);              
                }
                else{                    
                    nodo aux = inicio;                    
                    for (int i = 0; i < (posicion-1); i++) {
                        aux = aux.getSiguiente();
                    }                   
                    nodo siguiente = aux.getSiguiente();                   
                    aux.setSiguiente(nuevo);                    
                    nuevo.setSiguiente(siguiente);
                }            }           
            tamanio++;
        }
    }
   
    public int getValor(int posicion) throws Exception{        
        if(posicion>=0 && posicion<tamanio){            
            if (posicion == 0) {                
                return inicio.getValor();
            }else{               
                nodo aux = inicio;                
                for (int i = 0; i < posicion; i++) {
                    aux = aux.getSiguiente();
                }                
                return aux.getValor();
            }        
        } else {
            throw new Exception("Posicion inexistente en la lista.");
        }
    }
    
    public boolean buscar(int referencia){        
        nodo aux = inicio;       
        boolean encontrado = false;        
        while(aux != null && encontrado != true){            
            if (referencia == aux.getValor()){               
                encontrado = true;
            }
            else{               
                aux = aux.getSiguiente();
            }
        }       
        return encontrado;
    }
    
    public int getPosicion(int referencia) throws Exception{        
        if (buscar(referencia)) {            
            nodo aux = inicio;           
            int cont = 0;            
            while(referencia != aux.getValor()){               
                cont ++;                
                aux = aux.getSiguiente();
            }           
            return cont;       
        } else {
            throw new Exception("Valor inexistente en la lista.");
        }
    }
    
    public void editarPorReferencia(int referencia, int valor){
       
        if (buscar(referencia)) {           
            nodo aux = inicio;            
            while(aux.getValor() != referencia){
                aux = aux.getSiguiente();
            }           
            aux.setValor(valor);
        }
    }
   
    public void editarPorPosicion(int posicion , int valor){        
        if(posicion>=0 && posicion<tamanio){            
            if(posicion == 0){                
                inicio.setValor(valor);
            }
            else{               
                nodo aux = inicio;               
                for (int i = 0; i < posicion; i++) {
                    aux = aux.getSiguiente();
                }               
                aux.setValor(valor);
            }
        }
    }
    
    public void removerPorReferencia(int referencia){        
        if (buscar(referencia)) {            
            if (inicio.getValor() == referencia) {                
                inicio = inicio.getSiguiente();
            } else{                
                nodo aux = inicio;                
                while(aux.getSiguiente().getValor() != referencia){
                    aux = aux.getSiguiente();
                }               
                nodo siguiente = aux.getSiguiente().getSiguiente();                
                aux.setSiguiente(siguiente);  
            }           
            tamanio--;
        }
    }   

      
    public void removerPorPosicion(int posicion){       
        if(posicion>=0 && posicion<tamanio){           
            if(posicion == 0){                
                inicio = inicio.getSiguiente();
            }          
            else{              
                nodo aux = inicio;               
                for (int i = 0; i < posicion-1; i++) {
                    aux = aux.getSiguiente();
                }               
                nodo siguiente = aux.getSiguiente();               
                aux.setSiguiente(siguiente.getSiguiente());
            }
            
            tamanio--;
        }
    }
        
    public void listar(){       
        if (!esVacia()) {           
            nodo aux = inicio;            
            int i = 0;            
            while(aux != null){               
                System.out.print(i + ".[ " + aux.getValor() + " ]" + " ->  ");                
                aux = aux.getSiguiente();               
                i++;
            }
        }
    }
}

CLASE MAIN

package Trabajo;

/**
 *
 * @author Jhon
 */
public class Main {
     public static void main(String[] args) throws Exception {
        Lista lista = new Lista();
        
        System.out.println("<<-- Ejemplo de lista simple -->>\n");
        
        // Agregar al final de la lista
        lista.agregarAlFinal(12);
        lista.agregarAlFinal(15);
        lista.agregarAlFinal(9);
        // Agregar in inicio de la lista
        lista.agregarAlInicio(41);
        lista.agregarAlInicio(6);
        
        System.out.println("<<-- Lista -->>");
        lista.listar();
        
        System.out.println("\n\n<<-- Tamaño -->");
        System.out.println(lista.getTamanio());
        
        System.out.println("\n<<-- Obtener el valor del nodo en la posicion 3 -->>");
        System.out.println(lista.getValor(3));
        
        System.out.println("\nInsrta un nodo con valor 16 despues del 15");
        lista.insertarPorReferencia(15, 16);
        lista.listar();
        System.out.print(" | Tamaño: ");
        System.out.println(lista.getTamanio());
        
        System.out.println("\n\nInsrta un nodo con valor 44 en la posición 3");
        lista.insrtarPorPosicion(3, 44);
        lista.listar();
        System.out.print(" | Tamaño: ");
        System.out.println(lista.getTamanio());
        
        System.out.println("\nActualiza el valor 12 del tercer nodo por 13");
        lista.editarPorReferencia(12, 13);
        lista.listar();
        System.out.print(" | Tamaño: ");
        System.out.println(lista.getTamanio());
        
        System.out.println("\nActualiza el valor nodo en la posición 0 por 17");
        lista.editarPorPosicion(0, 17);
        lista.listar();
        System.out.print(" | Tamaño: ");
        System.out.println(lista.getTamanio());
        
        System.out.println("\nElimina el nodo con el valor 41");
        lista.removerPorReferencia(41);        
        lista.listar();
        System.out.print(" | Tamaño: ");
        System.out.println(lista.getTamanio());
        
        System.out.println("\nElimina el nodo en la posición 4");
        lista.removerPorPosicion(4);        
        lista.listar();
        System.out.print(" | Tamaño: ");
        System.out.println(lista.getTamanio());
        
        System.out.println("\nConsulta si existe el valor 30");
        System.out.println(lista.buscar(30));
        
        System.out.println("\nConsulta la posicion del valor 9");
        System.out.println(lista.getPosicion(9));
        
//        System.out.println("\nElimina la lista");
//        lista.eliminar();
        
        System.out.println("\nConsulta si la lista está vacia");
        System.out.println(lista.esVacia());
        
        System.out.println("\n\n<<-- Fin de ejemplo lista simple -->>");
    }   
}

Referencia Concepto : Bryan Acosta estudiante de Ingeniería en Informática de la Universidad Central del Ecuador.


No hay comentarios:

Publicar un comentario