version: 1.10
package ring
import "container/ring"
概述
ring 包实现了循环链表的操作。
索引
例子
文件
type Ring ¶
- type Ring struct {
- Value interface{} // 被用户使用,本库不会接触
- // 包含被过滤的或未导出的字段
- }
Ring 是一个循环链表。循环链表没有开始和结束,通过循环链表中的任意一个元素的指针都能引用整个链表。使用值为 nil 的 Ring 指针来表示空循环链表。零值循环链表是指链表只有一个值为 nil 的元素。
func New ¶
New 函数创建一个元素个数为 n 的循环链表。
func (*Ring) Do ¶
- func (r *Ring) Do(f func(interface{}))
Do 方法对循环链表的每个元素都调用函数 f 。如果函数 f 改变了循环链表,Do 方法的结果将无法预测。
// 创建一个大小为5的循环链表r := ring.New(5)// Get the length of the ring// 获得循环链表的长度// 用若干整数来初始化循环链表for i := 0; i < n; i++ {r.Value = ir = r.Next()}// 迭代循环链表并打印内容r.Do(func(p interface{}) {fmt.Println(p.(int))})// Output:// 0// 1// 2// 3// 4
func (*Ring) Len ¶
Len 方法计算循环链表 r 的元素个数。函数的执行时间与元素个数成正比。
// 创建一个大小为4的循环链表r := ring.New(4)// 打印循环链表的长度fmt.Println(r.Len())// Output:// 4
func (*Ring) Link ¶
Link 方法连接循环链表 r 和 s ,所以 r.Next() 会将变成 s ,并且函数返回 r.Next() 的原来的值。参数 r 一定不能是空。
如果 r 和 s 指向同一个循环链表,连接它们会移除循环链表里 r 和 s 之间的元素。被移除的元素形成了一个子循环链表,函数返回的是对这个子循环链表的引用(如果没有元素被移除,返回结果是原来的 r.Next() 的值,而不是 nil)。
如果 r 和 s 指向不同的循环链表,连接它们将把 s 中的元素插入到 r 中,合成一个循环链表。函数返回的结果指向插入后的 s 的最后一个元素的下一个元素。
// 创建两个循环链表, r 和 s,长度都是2r := ring.New(2)s := ring.New(2)// 获得循环链表的长度lr := r.Len()ls := s.Len()// 初始化 r 中元素的值为0for i := 0; i < lr; i++ {r.Value = 0r = r.Next()}// 初始化 s 中元素的值为1for j := 0; j < ls; j++ {s.Value = 1s = s.Next()}// 连接 r 和 srs := r.Link(s)// 迭代组合后的循环链表并打印内容rs.Do(func(p interface{}) {fmt.Println(p.(int))})// Output:// 0// 0// 1// 1
func (*Ring) Move ¶
Move 方法把循环链表中的 n % r.Len() 个元素向后(n < 0)或向前(n >= 0)移动,函数返回这个循环链表。r 一定不能是空。
// 创建一个大小为5的循环链表r := ring.New(5)// 获得循环链表的长度n := r.Len()// 用若干整数初始化循环链表for i := 0; i < n; i++ {r.Value = ir = r.Next()}// 把循环链表向前移动3步r = r.Move(3)// 迭代循环链表并打印内容r.Do(func(p interface{}) {fmt.Println(p.(int))})// Output:// 3// 4// 0// 1// 2
func (*Ring) Next ¶
Next 方法返回循环链表中的下一个元素。r 一定不能是空。
// 创建一个大小为5的循环链表r := ring.New(5)// 获得循环链表的长度n := r.Len()// 用若干整数初始化循环链表for i := 0; i < n; i++ {r.Value = ir = r.Next()}// 迭代循环链表并打印内容for j := 0; j < n; j++ {fmt.Println(r.Value)r = r.Next()}// Output:// 0// 1// 2// 3// 4
func (*Ring) Prev ¶
Prev 方法返回循环链表中的前一个元素。r 一定不能是空。
// 创建一个大小为5的循环链表r := ring.New(5)// 获得循环链表的长度n := r.Len()// 用若干整数初始化循环链表for i := 0; i < n; i++ {r.Value = ir = r.Next()}// 迭代循环链表并打印内容for j := 0; j < n; j++ {r = r.Prev()fmt.Println(r.Value)}// Output:// 4// 3// 2// 1// 0
func (*Ring) Unlink ¶
Unlink 方法以 r.Next() 为起点,从循环链表 r 中移除 n % r.Len() 个元素。如果 n % r.Len() 等于0, r 保持不变。函数返回被移除的子循环链表。r 一定不是是空。
// 创建一个大小为6的循环链表r := ring.New(6)// 获得循环链表的长度n := r.Len()// 用若干整数初始化循环链表for i := 0; i < n; i++ {r.Value = ir = r.Next()}// 从 r.Next() 开始,Unlink 3个元素r.Unlink(3)// 迭代循环链表的剩余部分并打印内容r.Do(func(p interface{}) {fmt.Println(p.(int))})// Output:// 0// 4// 5
