约瑟夫杀人算法
把M个俘虏围成一圈,从1数数,数到N时,杀掉一个人,重新开始从1数数到N再杀掉,以此类推,直到剩下一个人。
类比:丢手绢
public class Josef {
private Node head;
public Josef(int m,int n) {
createCircle(n);
delete(n);
}
//根据所给M创建单向链表
public void createCircle(int m){
head = new Node(1);
Node x = head;//目前被点到的人
for(int i=2;i<=m;i++) {
x = (x.next = new Node(i));
}
x.next = head;
}
//根据所给n开始进行杀人
public void delete(int n){
while(head.next!=head){
for (int i = 1; i <n-1 ; i++) {
head=head.next;
}
System.out.println("被删除的数为:"+head.next.value);
head.next=head.next.next;
head=head.next;
}
System.out.println("最后的数字是"+head.value);
}
public static void main(String[] args) {
Josef josef=new Josef(6,5);
}
class Node {
private int value;
private Node next;
public Node(int value) {
this.value = value;
this.next = null;
}
}
}
被删除的数为:5
被删除的数为:4
被删除的数为:6
被删除的数为:2
被删除的数为:3
最后的数字是1