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
Alper
source share