package main import ( "fmt" ) // 初始化空的循环链表,前驱和后驱都指向自己,因为是循环的 func(r *Ring) init() *Ring { r.next = r r.prev = r return r } funcmain() { r := new(Ring) r.init() }
创建一个指定大小 N 的循环链表,值全为空:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
// 创建N个节点的循环链表 funcNew(n int) *Ring { if n <= 0 { returnnil } r := new(Ring) p := r for i := 1; i < n; i++ { p.next = &Ring{ prev: p } p = p.next } p.next = r r.prev = p
func(r *Ring) Move(n int) *Ring { if r.next == nil { return r.init() } switch { case n < 0: for ; n < 0; n++ { r = r.prev } case n > 0: for ; n > 0; n-- { r = r.next } } return r }
4.添加节点
1 2 3 4 5 6 7 8 9 10 11 12
// 往节点A,链接一个节点,并且返回之前节点A的后驱节点 func(r *Ring) Link(s *Ring) *Ring { n := r.Next() if s != nil { p := s.Prev() r.next = s s.prev = r n.prev = p p.next = n } return n }
添加节点的操作比较复杂,如果节点 s 是一个新的节点。那么也就是在 r 节点后插入一个新节点 s ,而 r 节点之前的后驱节点,将会链接到新节点后面,并返回 r 节点之前的第一个后驱节点 n 。