package com.zrar.nsfwpt.sszyfw.blh;
public class YSF {
private static final int MAX=20;//犯人总数目
private static final int KILL=5;//每数到五,杀一人 ,杀人后从一开始重新数(用节点来代表人)
public class Node{
int val;//表示此节点的下标值
Node next;//此节点的下一个节点
public Node(int val) {
this.val=val;
}
}
public void Ysf(){
Node fir=new Node(1);//定义第一个节点
Node current=fir;//设置当前节点为第一个节点
int c=0;
for(int a=2;a<=MAX;a++){
//定义下一个节点 并让当前节点的next为下一个节点 让他们依次连起来
// (但最后一个节点和第一个节点并未连接)。
current=current.next=new Node(a);
}
current.next=fir;//此时当前节点为最后一个节点 让它的next为第一个节点。
// 此时这些节点依次连接了起来
System.out.println("杀人的顺序为:");
while(current !=current.next){//当 当前节点和当前节点的下一个节点不是同一个节点时
// 说明至少剩下两个人 继续杀人
for(int b=1;b<KILL;b++){
//每数四个节点跳出for循环
current=current.next;
}
//应该杀死当前节点的下一个节点
//即 让当前节点的next为它的next的next 即可
c++;
System.out.println("第"+c+"次杀死"+current.next.val+"号节点的人");
current.next=current.next.next;
}
//打印出幸存者下标
System.out.println("幸存者为:"+current.val+"号节点的人");
}
public static void main(String []args){
YSF g=new YSF();
g.Ysf();
}
}
运行结果为
杀人的顺序为:
第1次杀死5号节点的人
第2次杀死10号节点的人
第3次杀死15号节点的人
第4次杀死20号节点的人
第5次杀死6号节点的人
第6次杀死12号节点的人
第7次杀死18号节点的人
第8次杀死4号节点的人
第9次杀死13号节点的人
第10次杀死1号节点的人
第11次杀死9号节点的人
第12次杀死19号节点的人
第13次杀死11号节点的人
第14次杀死3号节点的人
第15次杀死17号节点的人
第16次杀死16号节点的人
第17次杀死2号节点的人
第18次杀死8号节点的人
第19次杀死14号节点的人
幸存者为:7号节点的人