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()
}
 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM