面试算法之约瑟夫问题

面试算法之约瑟夫问题

题目:
在这里插入图片描述
一、构建环形链表

type Boy struct{
	num int
    next *Boy
}
func Add(num int) *Boy{
	temp:=&Boy{}
	help:=&Boy{}
	if num<1{
		fmt.Println("num数目小于1...")
		return temp
	}    //小于1无法构建链表
    for i:=1;i<=num;i++{
		 boy:=&Boy{
			 num:i,
		 }
        if i==1{   //第一个节点,自己指向自己
			temp=boy
			help=boy
			help.next=temp
		}else{
			help.next=boy
			help=boy
			help.next=temp
		}
	}     //构建环形链表
	return temp
}

二、环形链表的展示

func Show(temp *Boy){
	first:=temp
	if first.next==nil{
		fmt.Println("环形链表的值为空...")
		return
	}
     for{
		 fmt.Printf("[%d]号->",first.num)
		 if first.next==temp{
			 break
		 }
		 first=first .next
	 }
}

三、约瑟夫问题实现

func PlayGame(first *Boy,startno int,countno int){
	if first.next==nil{
		fmt.Println("链表空空如也...")
	}
	help:=first
	for{
		if help.next==first{
			break
		}
		help=help.next
	}
	for i:=0;i<startno-1;i++{
		first=first.next
		help=help.next
	}
	for{
		for i:=0;i<countno-1;i++{
			first=first.next
			help=help.next
		}
		fmt.Printf("[%d]号->",first.num)
		first=first.next
		help.next=first
		if first==help{
			break
		}
	}
    fmt.Printf("[%d]号->",first.num)

}

四、主函数调用

func main(){
    temp:=Add(5)
	Show(temp)
	fmt.Println()
	fmt.Println("约瑟夫出列:")
	PlayGame(temp,2,3)
}

看完如果对自己有帮助,请点赞支持,谢谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值