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不能为空。

猜你喜欢

转载自blog.csdn.net/weixin_42117918/article/details/90737993