How to remove an item from a list, iterating the same list in golang

I am new to the language. I would like to remove items from a list, iterate over a list based on a condition in go. For example, I want to remove duplicate items from a list. The code is below.

package main import ( "container/list" "fmt" ) var sMap map[int]bool func main() { l := list.New() l.PushFront(4) l.PushFront(5) l.PushFront(7) l.PushFront(6) l.PushFront(5) l.PushFront(4) l.PushFront(5) l.PushFront(7) l.PushBack(9) l = removeDuplicate(l) for e := l.Front(); e != nil; e = e.Next() { fmt.Println(e.Value) } } func removeDuplicate(l *list.List) *list.List { sMap = make(map[int]bool) for e := l.Front(); e != nil; e = e.Next() { m := e.Value.(int) fmt.Println("VALUE : ", m) if sMap[m] == true { fmt.Println("Deleting ", e.Value) l.Remove(e) } else { fmt.Println("Adding New Entry", e.Value) sMap[m] = true } } return l } 

The code above goes through the list only until the first deletion. I am trying to delete an item during iteration through the same list. It is for this reason that it does not work. Can anyone suggest a list of iterators in golang?

+7
list go listiterator
source share
1 answer

If e is removed from the list, then calling e.Next() in the next loop will return nil . Therefore, before deleting e you must assign e.Next() next . Here is an example to clear all items by iterating (in list_test.go )

 // Clear all elements by iterating var next *Element for e := l.Front(); e != nil; e = next { next = e.Next() l.Remove(e) } 

The same template can be applied to the question as follows:

 package main import ( "container/list" "fmt" ) var sMap map[int]bool func main() { l := list.New() l.PushFront(4) l.PushFront(5) l.PushFront(7) l.PushFront(6) l.PushFront(5) l.PushFront(4) l.PushFront(5) l.PushFront(7) l.PushBack(9) l = removeDuplicate(l) for e := l.Front(); e != nil; e = e.Next() { fmt.Println(e.Value) } } func removeDuplicate(l *list.List) *list.List { sMap = make(map[int]bool) var next *list.Element for e := l.Front(); e != nil; e = next { m := e.Value.(int) next = e.Next() fmt.Println("VALUE : ", m) if sMap[m] == true { fmt.Println("Deleting ", e.Value) l.Remove(e) } else { fmt.Println("Adding New Entry", e.Value) sMap[m] = true } } return l } 

Exit

 VALUE : 7 Adding New Entry 7 VALUE : 5 Adding New Entry 5 VALUE : 4 Adding New Entry 4 VALUE : 5 Deleting 5 VALUE : 6 Adding New Entry 6 VALUE : 7 Deleting 7 VALUE : 5 Deleting 5 VALUE : 4 Deleting 4 VALUE : 9 Adding New Entry 9 7 5 4 6 9 
+10
source share

All Articles