约瑟夫问题

约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。

import java.util.Scanner;  
  
/** 
 * 循环列表的Java实现,解决约瑟夫环问题 
 */  
public class YueSeFuHuan  
{  
    //定义结点,必须是static  
    static class Node  
    {  
        int data;  
        Node next;  
        Node(int arg1)  
        {  
            this.data = arg1;  
        }  
    }  
    public static void main(String[] args)  

    {
        
         
      int n = 0,m = 0;//定义总人数n,和出圈数字m  
      //输入n和m  
      System.out.println("输入总人数n,出圈数字m");  
      Scanner scanner = new Scanner(System.in);  
      n = scanner.nextInt();//数组大小  
      m = scanner.nextInt();// sp num  
      
      Node head=new Node(1);
      
      Node p=head;
      for(int i=2;i<=n;i++)
      {
          Node current=new Node(i);
          p.next=current;
          p=current;
          
      }
      p.next=head;//尾接头形成循环链表(p为尾结点)  
      
   
     
      while(p!=p.next)//当只存在p一个节点时 退出   
      {
          //要删除某节点 要找到该节点之前的那个节点
          
          for(int i=1;i<m;i++)
             p=p.next;//向后移m-1 次 即可得到 此时的p指向 应删除节点的前一个节点
          
          
          System.out.println("此时删除:"+p.next.data);
          p.next=p.next.next;
          
      }
      
      System.out.print("
幸运者是:"+p.data);
        
    }
 
      
}  

结果:

输入总人数n,出圈数字m
5 3
此时删除:3
此时删除:1
此时删除:5
此时删除:2

幸运者是:4
原文地址:https://www.cnblogs.com/xiaodeyao/p/5301805.html