Golang container包下ring(数据结构中的循环链表)的使用
作者:神秘网友
发布时间:2020-09-09 13:05:38
Golang container包下ring(数据结构中的循环链表)的使用
Golang container包下ring(数据结构中的循环链表)的使用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不能为空。