Go言語の練習 - container/list

container/listは双方向連結リストが実装されている。
以下は重複する要素を削除するコード。

package main

import (
	"container/list"
	"fmt"
)

// mapを使うパターン
func uniquify(l *list.List) {

	table := make(map[interface{}]bool)
	element := l.Front()

	for element != nil {
		if _, ok := table[element.Value]; ok {
			tmp := element.Next()
			l.Remove(element)
			element = tmp
		} else {
			table[element.Value] = true
			element = element.Next()
		}
	}
}

// 2重ループを使うパターン
func uniquify2(l *list.List) {

	element := l.Front()

	for element != nil {
		runner := element.Next()
		for runner != nil {
			if runner.Value == element.Value {
				tmp := runner.Next()
				l.Remove(runner)
				runner = tmp
			} else {
				runner = runner.Next()
			}
		}
		element = element.Next()
	}
}

func main() {
	l := list.New()

	l.PushBack("Apple")
	l.PushBack("Grape")
	l.PushBack("Orange")
	l.PushBack("Apple")
	l.PushBack("Grape")
	l.PushBack("Orange")

	uniquify(l)
	for e := l.Front(); e != nil; e = e.Next() {
		fmt.Printf("%v\n", e.Value)
	}
}
Apple
Grape
Orange