golang list使用 双层 循环 删除 遍历

queue队列:

import (
    "container/list"
    "sync"
)

type Queue struct { l *list.List m sync.Mutex } func NewQueue() *Queue { return &Queue{l: list.New()} } func (q *Queue) PushBack(v interface{}) { if v == nil { return } q.m.Lock() defer q.m.Unlock() q.l.PushBack(v) } func (q *Queue) Front() *list.Element { q.m.Lock() defer q.m.Unlock() return q.l.Front() } func (q *Queue) Remove(e *list.Element) { if e == nil { return } q.m.Lock() defer q.m.Unlock() q.l.Remove(e) } func (q *Queue) Len() int { q.m.Lock() defer q.m.Unlock() return q.l.Len() } 

这样就基本满足了.

使用过程中, 发现list有个小坑: 遍历的时候不能Remove

for e := l.Front(); e != nil; e = e.Next {
    l.Remove(e)
}

按照设想, 这应该会移除list里所有的元素, 但是, 结果是只移除了第一个. 原因是: Remove时候, e.next = nil, 使得for判断中, e != nil不成立了, 所以退出了循环.
这时候有两种解决办法:

var next *list.Element
for e := l.Front(); e != nil; e = next { next = e.Next() l.Remove(e) } 
for {
    e := l.Front()
    if e == nil {
            break
    }
    l.Remove(e) }

如果是双层循环删除的话, 注意如果第二个循环删除的元素在第一个删除的元素后一位, 需要再前进一位:
if j == nexte {
nexte = nexte.Next()
}
 

 

 

转载于:https://www.cnblogs.com/mafeng/p/10794859.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值