约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知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