golang 每日一练 list使用简单实例

golang 的list作为一个双向链表结构,有如下功能


package main

import (
"container/list"
      "fmt"
)

// New() *List 返回一个list
// func(l *List) Back() 获取list最后一个元素
// func(l *List) Next() 获取该元素的下一个元素,如果没有返回nil
// func(l *List) Prev() 获取该元素的上一个元素,如果没有返回nil
// func(l *List) Front() 获取元素第一个元素
// func(l *List) Init() *List 初始化或者清除list
// func(l *List) InsertAfter(v interface{},make *Element) *Element //在list中元素mark之后插入一个v的元素,并返回改元素,如果mark不是list中元素,则list不改变
// func(l *List) InsertBefore(v interface{},make *Element) *Element //在list中元素mark之前插入一个v的元素,并返回改元素,如果mark不是list中元素,则list不改变
// func(l *List) Len 获取list长度
// func(l *List) MoveAfter(e ,mark *Element) 将元素e移到元素mark 之后,如果元素e不存在或者mark不属于list l 或者e == mark,则元素不改变
// func(l *List) MoveBefore(e ,mark *Element) 将元素e移到元素mark 之前,如果元素e不存在或者mark不属于list l 或者e == mark,则元素不改变
// func(l *List) MoveToBack(e  *Element) 将元素e移到list l尾部,如果e不属于list l 则list不改变
// func(l *List) MoveToFront(e  *Element) 将元素e移到list l头部,如果e不属于list l 则list不改变
// func(l *List) PushBack(v interface{}) 在list尾部插入值为v的元素,并返回该元素
// func(l *List) PushFront(v interface{}) 在list头部插入值为v的元素,并返回该元素
// func(l *List) PushFrontList(other *List) 在list首部插入另外一个list,其中的l 和other 可以相等
// func(l *List) Remove(e *Element) interface{} 如果元素e属于list l,将其从list中删除,并返回元素e的值


type person struct {
name string
      sex string
}

func each(l *list.List) {
fmt.Println("-----")
for i:=l.Front();i!=nil;i = i.Next() {
fmt.Println(i)
}
}

func clear(l *list.List) {
var n *list.Element
for i:=l.Front();i!=nil;i = n {
//把下一个指向一个中间变量,在remove结束之后,才能继续指向下一个
             n = i.Next()
fmt.Println("清除",i.Value.(person).name)
l.Remove(i)
}
}

func main() {
l := list.New()
//在尾部插入
      l.PushBack(person{"张三","man"})
l.PushFront(person{"李四","woman"})
//获取最后一个元素 {张三 man}
      fmt.Println(l.Back())
//获取第一个元素 {李四 woman}
      fmt.Println(l.Front())
//初始化 请客原来的 list
      //l.Init()
      //返回 nil
      //李四后面插入王五
      l.InsertAfter(person{"王五","man"},l.Front())
//{李四 woman} {王五 man} {张三 man}
      each(l)
//把张三弄到 李四之后
      l.MoveAfter(l.Back(),l.Front())
//{李四 woman} {张三 man} {王五 man}
      each(l)
l2 := list.New()
l2.PushFront(person{"赵六","woman"})
l.PushBackList(l2)
//{李四 woman} {张三 man} {王五 man} {赵六 woman}
      each(l)
//清除 李四 清除 张三 清除 王五 清除 赵六
      clear(l)
}


重点:

遍历移除元素时,需要一个临时指针作为暂存,以防remove清除之后无法找到下一个指针照常 .Next()为空照常循环过早结束。

在线交流