- Estructuras dinámicas: Listas genéricas ordenadas


Una lista genérica es ordenada si cuando insertamos información en la lista queda ordenada respecto al campo info (sea de menor a mayor o a la inversa)

Ejemplo:

listaOrdenada.insertar(10)
lista ordenada
listaOrdenada.insertar(5)
lista ordenada
listaOrdenada.insertar(7)
lista ordenada
listaOrdenada.insertar(50)
lista ordenada

Podemos observar que si recorremos la lista podemos acceder a la información de menor a mayor.
No se requiere un método para ordenar la lista, sino que siempre permanece ordenada, ya que se inserta ordenada.

Programa:

public class ListaOrdenada {
    
    class Nodo {
        int info;
        Nodo sig;
    }
    
    private Nodo raiz;
    
    public ListaOrdenada() {
        raiz=null;
    }
      
    void insertar(int x)
    {
        Nodo nuevo = new Nodo ();
        nuevo.info = x;
        if (raiz==null) {
            raiz=nuevo;
        } else {
            if (x<raiz.info) {
                nuevo.sig=raiz;
                raiz=nuevo;
            } else {
                Nodo reco=raiz;
                Nodo atras=raiz;
                while (x>=reco.info && reco.sig!=null) {
                    atras=reco;
                    reco=reco.sig;
                }
                if (x>=reco.info) {
                    reco.sig=nuevo;
                } else {
                    nuevo.sig=reco;
                    atras.sig=nuevo;
                }
            }
        }
    }

    public void imprimir () {
        Nodo reco = raiz;
        while (reco != null) {
            System.out.print (reco.info + "-");
            reco = reco.sig;
        }
        System.out.println();
    }
        
    
    public static void main(String[] ar) {
        ListaOrdenada lo=new ListaOrdenada();
        lo.insertar(10);
        lo.insertar(5);
        lo.insertar(7);
        lo.insertar(50);
        lo.imprimir();
    }
}

El método insertar lo resolvemos de la siguiente forma:

Creamos primeramente el nodo, ya que siempre se insertará la información en la lista:

        Nodo nuevo = new Nodo ();
        nuevo.info = x;

Se puede presentar las siguientes situaciones, si está vacía, lo insertamos inmediatamente:

        if (raiz==null) {
            raiz=nuevo;
        } else {

Si no está vacía la lista, verificamos si lo debemos insertar en la primera posición de la lista (analizamos si la información a insertar es menor a lo apuntado por raiz en el campo info):

            if (x<raiz.info) {
                nuevo.sig=raiz;
                raiz=nuevo;
            } else {

Sino analizamos si lo debemos insertar en medio o al final de la lista.
Mientras la información a insertar sea mayor o igual a la información del nodo que visitamos ( x>=reco.info) y no lleguemos al final de la lista (reco.sig!=null) avanzamos reco al siguiente nodo y fijamos un puntero en el nodo anterior (atras)

                Nodo reco=raiz;
                Nodo atras=raiz;
                while (x>=reco.info && reco.sig!=null) {
                    atras=reco;
                    reco=reco.sig;
                }

Cuando salimos del while si la condición (x>=reco.info) continua siendo verdadera significa que se inserta al final de la lista, en caso contrario se inserta en medio de la lista:

                if (x>=reco.info) {
                    reco.sig=nuevo;
                } else {
                    nuevo.sig=reco;
                    atras.sig=nuevo;
                }

Retornar