@lyc1234
用Java单向循环链表解决约瑟夫问题
约瑟夫问题:设有n个人围坐在一张圆桌周围,先从某个人开始从1报数,数到m的人出列(即离开座位,不参与以后的报数),然后从出列的下一个人开始重新从1报数,数到m的人又出列,如此下去直到所有人都出列为止,试求出它们的出列顺序。
例如:当n=8,m=4时,若从第一个人(每个人的编号依次为1,2,…,n)开始报数,则得到的出列次序为:4,8,5,2,1,3,7,6;
此算法要求以n,m和s(从第s个人开始第1次报数)作为值参
思路
- 用java先构建一个单向循环链表
- java指针类,链表类
- 编写插入算法
- 编写出列算法:每次向后移动相同次数的指针,然后将指定位置的id输出,并删除该位置,继续下一次的移动。
代码实现
1.指针类
/*
通过每一个link内的next指向下一个link,从而达到构建指针的目的,方便使用和移动
*/
public class Link {
public int iData; //id
public double dData; //数据
public double item;//用来返回值(如果函数要返回值,由整个公共变量带回)
public Link next;/*指向下一个的节点,对另一个对象的引用,
并不是包括了这个对象。编译器会自动初始化null值,不需要自己再重新实例化一个对象*/
public Link(int id,double dd)//有参构造器 {
{
iData=id;
dData=dd;
}
public void displayLink() {
System.out.println("{"+iData+","+dData+"}");
}
}
2.单向循环链表类
/*构建一个头节点,尾节点,并采用尾部插入的方式达到循环的目的
*/