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

joker_zai · · 708 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

## **利用单向环形链表解决约瑟夫问题** **** **一开始我是想用list来解决的,但我想了很久都想不出来,只能用自定义的单向环形链表解决了。** **基本思路: 略!!** :smile: **直接上代码吧** ```golang //单向环形链表解决约瑟夫问题 package main import "fmt" //创建一个带自身指针的结构体 type node struct { no int next *node } //创建两个标记变量,head标记第一个结点,tail标记最后一个结点 var head, tail *node //追加结点 func addNode(n *node) { if tail == nil { head = n n.next = head tail = n } else { tail.next = n n.next = head tail = n //把链表最后一个的地址放到tail,即tail就是最后一个 } } //约瑟夫环,从编号为k的人开始报数,数到num的那个人出列 func joseph(k, num int) { //记数变量 count := 1 //先移动到第k个人 for i := 0; i < k-1; i++ { head = head.next tail = tail.next } //游戏从第k个人那里开始 for { count++ //开始记数 head = head.next tail = tail.next if count == num { //打印出数到num的人,并且让其出局 fmt.Println(head.no, "号出局") tail.next = head.next head = head.next count = 1 } //游戏剩最后一个人的时候结束 if head == tail { fmt.Println(head.no, "号赢得了游戏") break } } } ``` 玩一波: ```golang func main() { for i := 0; i < 5; i++ { n := &node{ no: i + 1, } //追加结点 addNode(n) } //从第一个人开始,数到3的那个人出列 joseph(1, 3) } ``` **总结:golang自带的list是不是不能直接用来解决该问题(本人新手,望批评指正!!)** **有哪位大神能用golang自带的list来解决吗?** **如果确实不能用golang自带的list来解决,请给出个肯定的回答,好让我不要钻牛角尖**

有疑问加站长微信联系(非本文作者))

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

708 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传