package cap3 // _node 链表节点,单向循环链表 type _node struct { Value int Next *_node } // 初始化长度为n的环 func _initCircle(n int) *_node { head := &_node{0, nil} current := head for i := 1; i < n; i++ { newNode := &_node{i, nil} current.Next = newNode current = newNode } // 头尾相连成环 current.Next = head return head } // Ex17Normal 小朋友游戏(约瑟夫问题),一般解法(非数学解法),n: 总人数(节点数),k:出队报数 func Ex17Normal(n, k int) int { circle := _initCircle(n) current := circle for current.Next != current { for i := 1; i < k-1; i++ { current = current.Next } // 报到k-1时移除下一个节点 next := current.Next current.Next = next.Next current = current.Next // 避免内存泄露 next.Next = nil } return current.Value } // Ex17Math 小朋友游戏(约瑟夫问题),公式递推解法,n: 总人数(节点数),k:出队报数 func Ex17Math(n, k int) int { idx := 0 for i := 2; i <= n; i++ { idx = (idx + k) % i } return idx }