如果没有对约瑟夫环有太大的印象,那么应该对丢花娟这个游戏有所印象吧,但这个游戏与单纯的丢花娟规则不一样,规则如下:
1、一群人围成一个圈
2、指定一个人执行丢花娟的任务
3、只能越过固定的人数(丢花娟是想丢哪就丢哪),自己也算其中一个人数
4、被丢到的人直接被淘汰,由他下一个人执行丢花娟任务,直到只剩下最后一个人
这个过程可以使用环形表的方式去解决,每一个人代表链表中的一个节点,废话不多说,直接上代码:
public class JosephRing {
/*
1、生成多个链表节点组合成环形链表表示环
2、输入开始位置,每个位置跳跃多少个节点(自己也算跳跃的节点)
3、淘汰最终到达的节点
4、从下一个节点开始,进行重复跳跃
5、输出淘汰的过程和最后留下的节点序号
*/
public static void main(String[] args) {
JosephRing josephRing = new JosephRing();
//以六个节点,每次跳跃5为例
josephRing.showJosephRing(1,5,josephRing.creatSingleLink(6));
}
//创建环形链表
public SingleLink creatSingleLink(int num){
SingleLink first = new SingleLink(-1);
SingleLink curNode = null;
for (int i = 1; i <= num; i++){
SingleLink nextNode = new SingleLink(i);
if (i == 1){
first = nextNode;
curNode = nextNode;
}
curNode.setNext(nextNode);
curNode = nextNode;
}
curNode.setNext(first);
return first;
}
//执行约瑟夫环
public void showJosephRing(int start, int jumpNum, SingleLink first){
SingleLink helper = null;
SingleLink curNode = first;
while (true){
if (curNode.getNext().getNo() == start){
helper = curNode;
break;
}
curNode = curNode.getNext();
}
while (true){
if (helper.getNext() == helper){
break;
}
for (int i=1; i<=jumpNum-1; i++){
helper = helper.getNext();
}
System.out.println("淘汰:"+helper.getNext().getNo());
helper.setNext(helper.getNext().getNext());
}
System.out.println("最终留下"+helper.getNo());
}
}
运行结果:
淘汰:5
淘汰:4
淘汰:6
淘汰:2
淘汰:3
最终留下1
我写的代码并不完善,比如很多会报错的地方都没有进行处理,也不是执行最快的,但是这是我在学习过程中的一种学习记录,能把自己所学的写出来才能说明自己掌握了,我还会分享更多自己学习到的东西,希望大家能多多指出我的错误。