用java单向循环链表解决约瑟夫问题

本文介绍了如何使用Java单向循环链表解决约瑟夫问题。通过创建指针类和链表类,实现插入和出列算法,详细阐述了报数过程,最终给出主程序实现。当n=8, m=4时,出列顺序为4, 8, 5, 2, 1, 3, 7, 6。" 124791849,12462711,时间轮调度原理与应用,"['后台开发', '算法', '并发处理']
摘要由CSDN通过智能技术生成

@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次报数)作为值参

思路

  1. 用java先构建一个单向循环链表
  2. java指针类,链表类
  3. 编写插入算法
  4. 编写出列算法:每次向后移动相同次数的指针,然后将指定位置的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.单向循环链表类

/*构建一个头节点,尾节点,并采用尾部插入的方式达到循环的目的
*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值