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

package datastructure.linkedList

import scala.util.control.Breaks

class Boy(private var no: Int ){
  def getNo: Int = this.no
  def setNo(no: Int): Unit = {
    this.no=no
  }
  //next域
  private var next : Boy = _
  def getNext: Boy = this.next
  def setNext(next: Boy): Unit = this.next=next

}

class CircleSingleLinkedList{
  //创建一个first节点
  private var first: Boy = _

  //添加节点构成环形链表
  def add(nums: Int):Unit = {
    //对nums进行数据校验
    if(nums < 1) {
      println("nums<1,输入的值不正确")
      return
    }
    var curBoy: Boy = null
    for (i <- 1 to nums ){
      //根据编号创建节点
      val boy = new Boy(i)
      //如果是第一个小孩
      if(i==1){
        first = boy
        boy.setNext(first)  //构成环
        curBoy = first      //指向第一个节点
      } else{
        curBoy.setNext(boy)
        boy.setNext(first)
        curBoy = boy
      }
    }
  }

  /**
   * 约瑟夫环问题
   * @param start 开始编号
   * @param countNum 数几下
   * @param nums 小孩的数量
   */
  def count(start: Int, countNum: Int, nums: Int): Unit ={
      //数据校验
    if(first == null || start<1 || start > nums){
      println("参数输入有误")
      return
    }
    //构建helper为环形的最后一个节点
    var helper: Boy = first
    val ctrl = new Breaks
    ctrl.breakable(
      while (true){
        if(helper.getNext == first) {
          ctrl.break()
        }
        helper = helper.getNext
      }
    )
    //报数之前需要将first和helper移动到start位置即移动start-1次
    for(i <- 0 until start-1 ){
      first=first.getNext
      helper=helper.getNext
    }
    //报数,移动countNum -1 次 然后出圈
    ctrl.breakable(
      while (true) {
        if(helper == first){//只有一个节点
          ctrl.break()
        }
        for(i <- 0 until countNum-1 ){
          first=first.getNext
          helper=helper.getNext
        }
        println(s"小孩出圈:${first.getNo}")
        //节点出圈
        first = first.getNext
        helper.setNext(first)
      }
    )
    //只剩最后一个节点
    println(s"小孩出圈:${first.getNo}")
  }

  def show(): Any = {
    //链表是否为空
    if (first == null ){
      println("链表为空")
      return
    }
    var curBoy: Boy = first
    do{
      println(curBoy.getNo)
      curBoy = curBoy.getNext
    }while(curBoy != first)
  }

}

object Josepfu {
  def main(args: Array[String]): Unit = {
    val list = new CircleSingleLinkedList
    list.add(25)
    list.count(1,2,25)
  }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值