package ring

import "container/ring"

Package ring 实现了循环链表的操作。

Index

Examples

Types

type Ring

type Ring struct {
	Value any // 供客户端使用;本库不会修改此字段
	// contains filtered or unexported fields
}

Ring 是循环链表(或环)中的元素。 环没有开头或结尾;指向任何环元素的指针都可以作为整个环的引用。 空环表示为 nil Ring 指针。 Ring 的零值是一个 Value 为 nil 的单元素环。

func New

func New(n int) *Ring

New 创建一个包含 n 个元素的环。

func (*Ring) Do

func (r *Ring) Do(f func(any))

Do 对环中的每个元素按正序调用函数 f。 如果 f 改变了 *r,则 Do 的行为是未定义的。

Example
package main

import (
	"container/ring"
	"fmt"
)

func main() {
	// Create a new ring of size 5
	r := ring.New(5)

	// Get the length of the ring
	n := r.Len()

	// Initialize the ring with some integer values
	for i := 0; i < n; i++ {
		r.Value = i
		r = r.Next()
	}

	// Iterate through the ring and print its contents
	r.Do(func(p any) {
		fmt.Println(p.(int))
	})

}

Output:

0
1
2
3
4

func (*Ring) Len

func (r *Ring) Len() int

Len 计算环 r 中元素的数量。 其执行时间与元素数量成正比。

Example
package main

import (
	"container/ring"
	"fmt"
)

func main() {
	// Create a new ring of size 4
	r := ring.New(4)

	// Print out its length
	fmt.Println(r.Len())

}

Output:

4
func (r *Ring) Link(s *Ring) *Ring

Link 将环 r 与环 s 连接,使 r.Next() 变为 s,并返回 r.Next() 的原始值。 r 不能为空。

如果 r 和 s 指向同一个环,连接它们会从环中移除 r 和 s 之间的元素。 被移除的元素形成一个子环,结果是对该子环的引用 (如果没有移除元素,结果仍然是 r.Next() 的原始值,而不是 nil)。

如果 r 和 s 指向不同的环,连接它们会创建一个单一的环, 其中 s 的元素被插入到 r 之后。结果指向插入后 s 的最后一个元素之后的元素。

func (*Ring) Move

func (r *Ring) Move(n int) *Ring

Move 在环中向后(n < 0)或向前(n >= 0)移动 n % r.Len() 个元素, 并返回该环元素。r 不能为空。

Example
package main

import (
	"container/ring"
	"fmt"
)

func main() {
	// Create a new ring of size 5
	r := ring.New(5)

	// Get the length of the ring
	n := r.Len()

	// Initialize the ring with some integer values
	for i := 0; i < n; i++ {
		r.Value = i
		r = r.Next()
	}

	// Move the pointer forward by three steps
	r = r.Move(3)

	// Iterate through the ring and print its contents
	r.Do(func(p any) {
		fmt.Println(p.(int))
	})

}

Output:

3
4
0
1
2

func (*Ring) Next

func (r *Ring) Next() *Ring

Next 返回环中的下一个元素。r 不能为空。

Example
package main

import (
	"container/ring"
	"fmt"
)

func main() {
	// Create a new ring of size 5
	r := ring.New(5)

	// Get the length of the ring
	n := r.Len()

	// Initialize the ring with some integer values
	for i := 0; i < n; i++ {
		r.Value = i
		r = r.Next()
	}

	// Iterate through the ring and print its contents
	for j := 0; j < n; j++ {
		fmt.Println(r.Value)
		r = r.Next()
	}

}

Output:

0
1
2
3
4

func (*Ring) Prev

func (r *Ring) Prev() *Ring

Prev 返回环中的前一个元素。r 不能为空。

Example
package main

import (
	"container/ring"
	"fmt"
)

func main() {
	// Create a new ring of size 5
	r := ring.New(5)

	// Get the length of the ring
	n := r.Len()

	// Initialize the ring with some integer values
	for i := 0; i < n; i++ {
		r.Value = i
		r = r.Next()
	}

	// Iterate through the ring backwards and print its contents
	for j := 0; j < n; j++ {
		r = r.Prev()
		fmt.Println(r.Value)
	}

}

Output:

4
3
2
1
0
func (r *Ring) Unlink(n int) *Ring

Unlink 从环 r 中移除 n % r.Len() 个元素,从 r.Next() 开始。 如果 n % r.Len() == 0,r 保持不变。 结果是已被移除的子环。r 不能为空。