zoukankan      html  css  js  c++  java
  • 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
    ", 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  的出列
    ", first.ID)
            first = first.next
            tail.next = first
            if tail == first {
                break
            }
        }
        fmt.Printf("编号为:%d  的出列
    ", 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:goprojectsrcgo_codedata_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 的出列

  • 相关阅读:
    《构建之法》第四章读后感
    复利计算-单元测试
    hadoop 不同URLTitle文件提取关联URL
    全角转半角-半角转全角
    leetcode unique binary search Tree
    leetcode validBST
    leetcode -- Flatten Binary Tree to Linked List
    堆排序
    比较字符串总结:如果计算两个字符串的相似度或者距离
    leetcode Populating Next Right Pointers in Each Node
  • 原文地址:https://www.cnblogs.com/xiximayou/p/12016460.html
Copyright © 2011-2022 走看看