内容简介:基本思路: 略!!:smile:玩一波:
利用单向环形链表解决约瑟夫问题
一开始我是想用list来解决的,但我想了很久都想不出来,只能用自定义的单向环形链表解决了。
基本思路: 略!!:smile:
直接上代码吧
//单向环形链表解决约瑟夫问题
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
}
}
}
玩一波:
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来解决,请给出个肯定的回答,好让我不要钻牛角尖
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
人月神话(40周年中文纪念版)
(美) 布鲁克斯(Brooks, F. P.) 著 / UML China翻译组,汪颖 译 / 清华大学出版社 / 2015-4-1 / 68.00元
在软件领域,很少能有像《人月神话》一样具有深远影响力和畅销不衰的著作。Brooks博士为人们管理复杂项目提供了最具洞察力的见解,既有很多发人深省的观点,又有大量软件工程的实践。本书内容来自Brooks博士在IBM公司SYSTEM/360家族和OS/360中的项目管理经验,该项目堪称软件开发项目管理的典范。该书英文原版一经面世,即引起业内人士的强烈反响,后又译为德、法、日、俄、中、韩等多种文字,全球......一起来看看 《人月神话(40周年中文纪念版)》 这本书的介绍吧!