约瑟夫问题
package org.demo.linkedList; /** * * 问题可用单链表循环解决 * 问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉 * */ public class Josefu { public static void main(String[] args) { // TODO Auto-generated method stub Josefu jose = new Josefu(); jose.solveJosefu(6, 1, 5); } public void solveJosefu(int num/*人数*/,int beg/*开始位置*/,int count/*报数*/) { if(num<beg||num<1||beg<1||count<1) { System.out.println("输入参数出错"); return; } CircleSingleLinkedList boys = new CircleSingleLinkedList(num); Boy curBoy = boys.getFirst(); //当前小孩 Boy preBoy = curBoy; //指向当前小孩的前一个位置 //初始化curBoy和preBoy位置 beg for(int i = 1 ;i<beg;i++) { curBoy = curBoy.getNext(); } while(preBoy.getNext()!=curBoy) { preBoy = preBoy.getNext(); } //end //开始报数,这个循环相当找出出列的人,并且将它删除 while(preBoy!=curBoy) { for(int i=0;i<count-1;i++) { curBoy = curBoy.getNext(); preBoy = preBoy.getNext(); } System.out.printf("出列的boy:%d\n" , curBoy.getNum()); //要出列的人 preBoy.setNext(curBoy.getNext()); curBoy = curBoy.getNext(); } System.out.printf("最后留在队列的boy:%d\n",curBoy.getNum()); } } class CircleSingleLinkedList{ private Boy first = null; public CircleSingleLinkedList(int num) { createCircleList(num); } public void createCircleList(int num) { if(num<1) return; first = new Boy(1); first.setNext(first); Boy curBoy = first; Boy temp = null; for(int i=2;i<=num;i++) { temp = new Boy(i); curBoy.setNext(temp); temp.setNext(first); curBoy = curBoy.getNext(); } } public Boy getFirst() { return first; } public void setFirst(Boy first) { this.first = first; } } class Boy{ private int num; private Boy next; public Boy(int num) { super(); this.num = num; } public int getNum() { return num; } public void setNum(int num) { this.num = num; } public Boy getNext() { return next; } public void setNext(Boy next) { this.next = next; } }