import "container/ring"
ring实现了环形链表的操作。
本文只讨论golang中container包下ring的使用,
循环链表的概念及原始操作参考其他。
示例代码:
package main
import (
"container/ring"
"fmt"
)
func main() {
r := ring.New(5)
n:=r.Len()
//赋值操作
for i:=1;i<=n;i++{
r.Value=i*i
r=r.Next()
}
//向后遍历
fmt.Print("\n==============向后遍历============\n")
for i:=0;i<n;i++{
fmt.Print(r.Value,"\t")
r=r.Next()
}
//向前遍历
fmt.Print("\n==============向前遍历==================\n")
for i:=0;i<n;i++{
r=r.Prev()
fmt.Print(r.Value,"\t")
}
//简单(快速)输出
fmt.Print("\n=============快速遍历=================\n")
r.Do(func(i interface{}) {
fmt.Print(i,"\t")
})
fmt.Print("\n================移动指针================\n")
r=r.Move(3)
r.Do(func(i interface{}) {
fmt.Print(i.(int),"\t")
})
fmt.Print("\n========两个环形链表的连接(拼接)==========\n")
s:=ring.New(5)
n1:=s.Len()
for i:=0;i<n1;i++{
s.Value=0
s=s.Next()
}
rs:=r.Link(s) //在r的末尾(r当前指针的上一个位置开始拼接)
rs.Do(func(i interface{}) {
fmt.Print(i,"\t")
})
fmt.Print("\n========环形链表的剪接==========\n")
delete:=rs.Unlink(6) //从当前 开始,向后移动6个位置后剪除
fmt.Print("删除之后,原链表数据:","\t")
rs.Do(func(i interface{}) {
fmt.Print(i,"\t")
})
fmt.Print("\n被删除的链表数据:","\t")
delete.Do(func(i interface{}) {
fmt.Print(i,"\t")
})
}
可以看出,ring没有对应的删除、添加数据的操作。
如果要添加数据,先创建数据对应的链表,执行:
func (*Ring) Link
func (r *Ring) Link(s *Ring) *Ring
Link连接r和s,并返回r原本的后继元素r.Next()。r不能为空。
如果r和s指向同一个环形链表,则会删除掉r和s之间的元素,删掉的元素构成一个子链表,返回指向该子链表的指针(r的原后继元素);如果没有删除元素,则仍然返回r的原后继元素,而不是nil。如果r和s指向不同的链表,将创建一个单独的链表,将s指向的链表插入r后面,返回s原最后一个元素后面的元素(即r的原后继元素)。
如果要删除数据,执行:
func (*Ring) Unlink
func (r *Ring) Unlink(n int) *Ring
删除链表中n % r.Len()个元素,从r.Next()开始删除。如果n % r.Len() == 0,不修改r。返回删除的元素构成的链表,r不能为空。