golang数据结构之用循环链表解决约瑟夫环问题

josephu.go

package link

import (
    "fmt"
)

type Kid struct {
    ID   int
    next *Kid
}

func AddKid(num int) *Kid {
    first := &Kid{}
    cur := &Kid{}

    if num < 1 {
        fmt.Println("不合法")
        return first
    }
    for i := 1; i <= num; i++ {
        kid := &Kid{
            ID: 1,
        }
        if i == 1 {
            first = kid
            cur = kid
            cur.next = first
        } else {
            tmpKid := &Kid{
                ID: i,
            }
            cur.next = tmpKid
            cur = tmpKid
            cur.next = first

        }
    }
    return first
}

func ShowKid(first *Kid) {
    if first.next == nil {
        fmt.Println("链表已空")
    }
    cur := first
    for {
        fmt.Printf("小孩编号:%d\n", cur.ID)
        if cur.next == first {
            break
        }
        cur = cur.next
    }
}
func Play(first *Kid, start int, count int) {

    if first.next == nil {
        fmt.Println("空链表")
        return
    }
    tail := first
    for {
        //到最后一个节点了
        if tail.next == first {
            break
        }
        tail = tail.next
    }
    //删除就以frst为主,让first移动到要删除的位置
    for i := 1; i <= start-1; i++ {
        first = first.next
        tail = tail.next
    }
    //开始数,然后进行删除
    for {
        for i := 1; i <= count-1; i++ {
            first = first.next
            tail = tail.next
        }
        fmt.Printf("编号为:%d  的出列\n", first.ID)
        first = first.next
        tail.next = first
        if tail == first {
            break
        }
    }
    fmt.Printf("编号为:%d  的出列\n", first.ID)
}

main.go

package main

import "go_code/data_structure/link"

func main() {

    first := link.AddKid(20)
    link.ShowKid(first)
    link.Play(first, 1, 3)
}

运行结果:

f:\goproject\src\go_code\data_structure>go run main.go
小孩编号:1
小孩编号:2
小孩编号:3
小孩编号:4
小孩编号:5
小孩编号:6
小孩编号:7
小孩编号:8
小孩编号:9
小孩编号:10
小孩编号:11
小孩编号:12
小孩编号:13
小孩编号:14
小孩编号:15
小孩编号:16
小孩编号:17
小孩编号:18
小孩编号:19
小孩编号:20
编号为:3 的出列
编号为:6 的出列
编号为:9 的出列
编号为:12 的出列
编号为:15 的出列
编号为:18 的出列
编号为:1 的出列
编号为:5 的出列
编号为:10 的出列
编号为:14 的出列
编号为:19 的出列
编号为:4 的出列
编号为:11 的出列
编号为:17 的出列
编号为:7 的出列
编号为:16 的出列
编号为:8 的出列
编号为:2 的出列
编号为:13 的出列
编号为:20 的出列

原文地址:https://www.cnblogs.com/xiximayou/p/12016460.html

时间: 2024-10-13 05:36:34

golang数据结构之用循环链表解决约瑟夫环问题的相关文章

C++循环链表解决约瑟夫环问题

约瑟夫环问题可以简单的使用数组的方式实现,但是现在我使用循环链表的方法来实现,因为上午看到一道面试题规定使用循环链表解决约瑟夫环问题. 什么是约瑟夫环? “约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到m的那个人出列:他的下一个人又从1开始报数,数到m的那个人又出列:依此规律重复下去,直到圆桌周围的人全部出列.”(百度百科中的解决办法列出了很多,可以看到循环链表并不是最简单的方法) 这道面试题考察了循环链表的“创建”,

C++ 用循环链表解决约瑟夫环问题

约瑟夫环问题 已知 n 个人(n>=1)围坐一圆桌周围,从 1 开始顺序编号,从序号为 1 的人开始报数,顺时针数到 m 的那个人出列.下一个人又从 1 开始报数,数到m 的那个人又出列.依此规则重复下去,直到所有人全部出列.请问最后一个出列的人的初始编号. 要求 输入人数 n,所报数 m,输出最后一个人的初始编号. 解决思路 首先因为是圆桌问题,使用链表解决的话需要构建循环链表. 接着是出列问题,这里我的设计思路是将指向链表的指针移动到需要出列的人的位置,然后根据正常的链表删除进行操作即可.

用循环链表解决约瑟夫环的问题

约瑟夫环问题简介 约瑟夫环问题的原来描述为,设有编号为1,2,--,n的n(n>0)个人围成一个圈,从第1个人开始报数,报到m时停止报数,报m的人出圈,再从他的下一个人起重新报数,报到m时停止报数,报m的出圈,--,如此下去,直到所有人全部出圈为止.当任意给定n和m后,设计算法求n个人出圈的次序.  稍微简化一下. 问题描述:n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出,剩下的人继续从0开始报数.求胜利者的编号. 解题思路 将每个人的编号作为结点值,因为报数是循环着来的,故可

用循环链表解决约瑟夫环问题

约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到m的那个人出列:他的下一个人又从1开始报数,数到m的那个人又出列:依此规律重复下去,直到圆桌周围的人全部出列. 下面我们用循环列表模拟这个过程: 1 //节点定义与单链表相同,在此省略 2 //use cyclical linked list to solve josephus problem 3 template <typename Type> class Linked

C语言用数组解决约瑟夫环问题

       在罗马人占领乔塔帕特后,39 个犹太人与约瑟夫及他的朋友躲到一个洞中,大家决定宁愿自杀也不要被敌人抓到,于是确定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止.然而约瑟夫和他的朋友并不想死去,那么他应该怎样安排他和他的朋友的位置,才能逃脱这场死亡游戏呢?         用C语言解决约瑟夫环问题的最佳方式是采用循环链表,但使用数组同样也可以解决瑟夫环的问题.采用循环链表的方法,以后详述.本节主

javascript中使用循环链表实现约瑟夫环问题

1.问题 2.代码实现 /** * 使用循环链表实现解决约瑟夫环问题 * */ //链表节点 function Node(element){ this.element = element; this.next = null; } //定义链表类 function LList(){ this.head = new Node("head"); this.head.next = this.head; this.find = find; this.insert = insert; this.f

循环链表解决约瑟夫问题

训练一下尾插法和循环链表的使用. //循环链表解决约瑟夫问题 #include <stdio.h> #include <stdlib.h> typedef struct CycleLinkList { int data; struct CycleLinkList * next; }cycleLinkList; cycleLinkList * h, * r, * s; // 头指针.尾指针 int main() { int i, j; int n, num; cycleLinkLis

php解决约瑟夫环的问题

php里面解决约瑟夫环还是比较方面的,但是下面的方法太费空间 <?php class SelectKing{ private $m;//幅度 private $n;//总数 public function __construct($m,$n){ $this->m = $m; $this->n = $n; } public function getKing(){ $mokeys = range(1, $this->n); $tmp = 0; while(count($mokeys)&

(java描述)关于链表的代码-----单双、循环链表、约瑟夫环、多项式相加

将链表头尾倒置 将几个链表合并成一个新的链表,将链表中重复的节点去掉,并按大小排序 双向循环链表 单向循环链表(约瑟夫循环) 多项式相加 程序源代码 单链表.单向循环链表结点类 package javab; public class Node { int data; Node next; public Node(int data){ this.data=data; } } 第一题代码: package javab; import java.util.Scanner; public class I