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 的行为是未定义的。
Output: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))
})
}
0
1
2
3
4
func (*Ring) Len
func (r *Ring) Len() int
Len 计算环 r 中元素的数量。
其执行时间与元素数量成正比。
Output: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())
}
4
func (*Ring) Link
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 的最后一个元素之后的元素。
Output:Example
package main
import (
"container/ring"
"fmt"
)
func main() {
// Create two rings, r and s, of size 2
r := ring.New(2)
s := ring.New(2)
// Get the length of the ring
lr := r.Len()
ls := s.Len()
// Initialize r with 0s
for i := 0; i < lr; i++ {
r.Value = 0
r = r.Next()
}
// Initialize s with 1s
for j := 0; j < ls; j++ {
s.Value = 1
s = s.Next()
}
// Link ring r and ring s
rs := r.Link(s)
// Iterate through the combined ring and print its contents
rs.Do(func(p any) {
fmt.Println(p.(int))
})
}
0
0
1
1
func (*Ring) Move
func (r *Ring) Move(n int) *Ring
Move 在环中向后(n < 0)或向前(n >= 0)移动 n % r.Len() 个元素,
并返回该环元素。r 不能为空。
Output: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))
})
}
3
4
0
1
2
func (*Ring) Next
func (r *Ring) Next() *Ring
Next 返回环中的下一个元素。r 不能为空。
Output: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()
}
}
0
1
2
3
4
func (*Ring) Prev
func (r *Ring) Prev() *Ring
Prev 返回环中的前一个元素。r 不能为空。
Output: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)
}
}
4
3
2
1
0
func (*Ring) Unlink
func (r *Ring) Unlink(n int) *Ring
Unlink 从环 r 中移除 n % r.Len() 个元素,从 r.Next() 开始。
如果 n % r.Len() == 0,r 保持不变。
结果是已被移除的子环。r 不能为空。
Output:Example
package main
import (
"container/ring"
"fmt"
)
func main() {
// Create a new ring of size 6
r := ring.New(6)
// 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()
}
// Unlink three elements from r, starting from r.Next()
r.Unlink(3)
// Iterate through the remaining ring and print its contents
r.Do(func(p any) {
fmt.Println(p.(int))
})
}
0
4
5