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 的出列