时间: 2020-09-3|25次围观|0 条评论


背景

golang没有queue这种类型,不过可以用slice、list模拟

slice当queue

声明队列var queue []int入队一个元素:queue = append(queue, 1)出队一个元素:if len(queue) > 1 {    queue = queue[1:]}

问题:当不断入队列时,需不停的扩容

list当queue

初始化一个队里:queue := list.New()入队一个元素:queue.PushBack(1)出队一个元素:if queue.Len() > 1 {    queue.Remove(queue.Front())}

实例:层次遍历二叉树

golang用slice、list当queue插图

list题解

func levelOrderBottom(root *TreeNode) [][]int {    var result [][]int    if root == nil {        return result    }    queue := list.New()    queue.PushBack(root)    for queue.Len() > 0 {        curlen := queue.Len()        var curList []int        for i:= 0; i < curlen; i++ {            curTree := queue.Remove(queue.Front()).(*TreeNode)            curList = append(curList, curTree.Val)            if curTree.Left != nil {                queue.PushBack(curTree.Left)            }            if curTree.Right != nil {                queue.PushBack(curTree.Right)            }        }        result = append([][]int{curList}, result...)    }    return result}

list用法

type Element    func (e *Element) Next() *Element    func (e *Element) Prev() *Element
type List func New()
*List func (l *List) Back() *Element // 最后一个元素 func (l *List) Front() *Element // 第一个元素 func (l *List) Init() *List // 链表初始化 func (l *List) InsertAfter(v interface{}, mark *Element) *Element // 在某个元素后插入 func (l *List) InsertBefore(v interface{}, mark *Element) *Element // 在某个元素前插入 func (l *List) Len() int // 在链表长度 func (l *List) MoveAfter(e, mark *Element) // 把e元素移动到mark之后 func (l *List) MoveBefore(e, mark *Element) // 把e元素移动到mark之前 func (l *List) MoveToBack(e *Element) // 把e元素移动到队列最后 func (l *List) MoveToFront(e *Element) // 把e元素移动到队列最头部 func (l *List) PushBack(v interface{}) *Element // 在队列最后插入元素 func (l *List) PushBackList(other *List) // 在队列最后插入接上新队列 func (l *List) PushFront(v interface{}) *Element // 在队列头部插入元素 func (l *List) PushFrontList(other *List) // 在队列头部插入接上新队列 func (l *List) Remove(e *Element) interface{} // 删除某个元素

举例

func listTest() {    queue := list.New()    queue.PushBack(1)    queue.PushBack(2)    fmt.Println(queue.Front())    fmt.Println(queue.Front().Value)    fmt.Println(queue.Front().Next().Value)    fmt.Println(queue.Back().Value)    fmt.Println(queue.Len())    queue.PushFront(0)    fmt.Println(queue)    queue2 := list.New()    queue2.PushBack(8)    queue2.PushBack(9)    queue3 := list.New()    queue2.PushBack(-1)    queue.PushBackList(queue2)    queue.PushFrontList(queue3)    fmt.Println(queue.Len())    queue.Remove(queue.Front())    fmt.Println(queue.Len())    queue.InsertBefore(100, queue.Front())    queue.MoveAfter(queue.Front(), queue.Front().Next())}

 

文章转载于:https://www.cnblogs.com/kaituorensheng/p/12257359.html

原著是一个有趣的人,若有侵权,请通知删除

本博客所有文章如无特别注明均为原创。
复制或转载请以超链接形式注明转自起风了,原文地址《golang用slice、list当queue
   

还没有人抢沙发呢~