GO学习系列:list

来源:互联网 发布:北京上游网络 编辑:程序博客网 时间:2024/06/11 19:49

最近工作中使用go语言,记录一下学习中的一些收获。


list.go

go中的list实现方法比较特殊,为一个环形的双向链表,一个root节点。

... -> root -> node1 -> node2 -> ...

... <- root <- node1 <- node2 <- ...

能够比较快速的得到链表首/尾节点。

以后在需要使用list的时候可以考虑这种形式。

type Element struct {

next, prev *Element

list*List // 该结点属于哪个list

Value interface{}  // go中任意类型的值,相当于void*,

// 变量名首字母大写,表示对外可见

}

type List struct {

root Element // 辅助节点

len   int

}

常用的函数:

func (e *Element) Next() *Element {

if p := e.next; e.list != nil && p != e.list.root {  //判断是否为root(无效节点)

return p

}

}

func (e *Element) Prev() *Element 

func (l *List) Init() *List {

l.root.next = &l.root

l.root.prev = &l.root

l.len = 0

return l

}

func New() *List { return new(List).Init() }

func (l *List) Len() int

func (l *List) Front *Element {

if l.len == 0 {//异常

return nil

}

return l.root.next

}

func (l *List) Back() *Element { ... l.root.prev }

func (l *List) lazyInit() {  // 最简单的初始化

if l.root.next == nil {

l.Init()

}

}

func (l *List) insert(e, at *Element) *Element {

n := at.next

at.next = e

e.next = n

e.prev = at

n.prev = e

e.list = l

l.len ++

return e

func (l *List) insertValue(v interface{}, at *Element) *Element {

return l.insert(&Element{Value: v}, at)


func (l *List) remove(e *Element) *Element {

e.prev.next = e.next

e.next.prev = e.prev

e.next = nil

e.prev = nil

e.list = nil

l.len--

return l

}

func (l *List) Remove(e *Element) interface{} {

if e.list == l {

l.remove(e)

}

return e.Value

}

func (l *List) PushFront(v interface{}) *Element

func (l *List) InsertBefore(v interface{}, mark *Element) *Element

func (l *List) InsertAfter(v interface{}, mark *Element) *Element

func (l *List) MoveToFront(e *Element) {

if e.list != l || l.root.next == e {

return

}

l.insert(l.remove(e), &l.root)

}

func (l *List) MoveToBack(e *Element) 

func (l *List) MoveBefore(e, mark *Element)

func (l *List) MoveAfter(e, mark *Element)

func (l *List) PushBackList(other *List)

func (l *List) PushFrontList(other *List)

可以自己写一遍函数实现


原创粉丝点击