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)
}
}
java单向环形链表解决约瑟夫环问题
最新推荐文章于 2022-03-19 22:50:11 发布