背景
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()) }
实例:层次遍历二叉树
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()) }