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

joker_zai · 2018-12-03 15:25:52 · 1273 次点击 · 预计阅读时间 1 分钟 · 大约8小时之前 开始浏览    
这是一个创建于 2018-12-03 15:25:52 的文章,其中的信息可能已经有所发展或是发生改变。

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


一开始我是想用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来解决,请给出个肯定的回答,好让我不要钻牛角尖


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

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

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