Estructura de datos. Listas simplemente enlazadas-Flavio josefo

Iniciado por carepapa, 8 Septiembre 2011, 05:16 AM

0 Miembros y 1 Visitante están viendo este tema.

carepapa

Hola a todos. Aca les dejo un aporte que hice de estructura de datos. Este es el famoso juego de flavio josefo pero con listas, me rompi la cabeza casi una semanita y espero que les sirva un poco para entender este tema. Alguna cosa me dicen y les trato de resolver las dudas.
Son 3 clases, una clase nodo otra es la clase lista y la clase principal.
public class Nodo {
    int dato;
    Nodo siguiente;
   
    public Nodo(){
        this.dato=0;
        siguiente=null;
    }   
       
    public Nodo(int n){
        this.dato=n;
        siguiente=null;
    }
}


import javax.swing.JOptionPane;

public class Lista {
   public Nodo cabeza;
   
     public Lista(){
         this.cabeza=null;
     }
     
     public void insertarFinal(int info){
        Nodo indice;
        indice=cabeza;
        if(indice==null){
            cabeza= new Nodo(info);
        } else{
            while(indice.siguiente!=null){
                indice=indice.siguiente;
            }
            indice.siguiente=new Nodo(info);
        }
       
    }
     
     public void insertarInicio(int info){ //porque recibe el valor que va dentro del nodo
         Nodo a= new Nodo(info);
         a.siguiente=cabeza;
         cabeza=a;
         a=null;
     }
     
     public void eliminarCabeza(){
         Nodo aux;
         aux=cabeza;
         cabeza=cabeza.siguiente;
         aux.siguiente=null;
     }
     public void Mostrar(){
         Nodo indice;
         indice=cabeza;
         while(indice!=null){
             System.out.print("\n"+indice.dato);
             indice=indice.siguiente;
         }
     }
}


import javax.swing.*;

public class Principal {

    public static void main(String[] args) {
        int k, contk = 0, n, soldvivo;
        Lista miLista = new Lista();
        Nodo ind1;
        Nodo ind2;
        Nodo cabeza;

        n = Integer.parseInt(JOptionPane.showInputDialog("Ingrese el número de soldados"));
        k = Integer.parseInt(JOptionPane.showInputDialog("Ingrese el número de la muerte"));

        for (int i = 0; i < n; i++) {
            miLista.insertarFinal(i + 1);
        }

        soldvivo = n;
        cabeza = miLista.cabeza;
        ind1 = cabeza;
        ind2 = cabeza;

        if (k == 1)
        {
            while (soldvivo > 1)
            {
                miLista.eliminarCabeza();
                soldvivo--;
            }

        }
        else {
            while (soldvivo > 1)
            {
                contk++;
                if (contk == k)
                {
                    if (ind1 == cabeza)
                    {
                        cabeza = cabeza.siguiente;
                        ind1.siguiente = null;
                        ind1 = cabeza;
                        ind2 = cabeza;
                        contk = 1;


                    }
                    else
                    {
                        while (ind2.siguiente != ind1)
                        {
                            ind2 = ind2.siguiente;
                        }
                        if (ind1.siguiente == null)
                        {
                            ind2.siguiente = null;
                            ind1 = ind2;
                            contk = 0;
                        }
                        else
                        {
                            ind2.siguiente = ind1.siguiente;
                            ind1.siguiente = null;
                            ind1 = ind2;
                            contk = 0;
                        }
                    }

                    soldvivo--;
                }
                if (soldvivo != 1)
                {
                    ind1 = ind1.siguiente;
                    if (ind1.siguiente == null)
                    {
                        contk++;
                        if (contk == k)
                        {
                            while (ind2.siguiente != ind1)
                            {
                                ind2 = ind2.siguiente;
                            }
                            ind2.siguiente = null;
                            soldvivo--;
                            contk = 0;
                        }
                        ind1 = cabeza;
                        ind2 = cabeza;
                    }
                }


            }
        }
        System.out.print(cabeza.dato);
    }
}