约瑟夫问题
41人坐成一圈,第一个人编号为1,以此类推,第n个人编号为n。
从编号为1开始报数,依次往后,报到3的人退圈;退出的下面哪一个重新从1开始报数,以此类推。求:最后剩下那个人原来的编号是多少?
代码示例:
public class JosephQuestion {
public static class Node<T>{
T item;
Node next;
public Node(T item, Node next) {
this.item = item;
this.next = next;
}
}
public static void main(String[] args) {
Node<Integer> first=null;
Node<Integer> previous=null;
for (int i = 1; i <= 41; i++) {
if (i==1){
first=new Node<>(i,null);
previous=first;
continue;
}
Node<Integer> node=new Node<>(i,null);
previous.next=node;
previous=node;
if (i==41){
previous.next=first;
}
}
// 计数器
int count=0;
//当前节点
Node<Integer> now=first;
//上一节点
Node<Integer> before=null;
while (now!=now.next){
count++;
if (count==3){
before.next=now.next;
System.out.print(now.item+",");
count=0;
now=now.next;
}else {
before=now;
now=now.next;
}
}
System.out.println(now.item);
}
}