golang数据结构之用循环链表解决约瑟夫环问题
Posted xiximayou
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 的出列
以上是关于golang数据结构之用循环链表解决约瑟夫环问题的主要内容,如果未能解决你的问题,请参考以下文章