Go言語の練習 - container/list 2回目

今日もなんとなくcontainer/listをいじってて、ついでに単方向連結リストを書いてみた。

package main

import (
	"container/list"
	"fmt"
)

type SinglyLinkedListNode struct {
	next  *SinglyLinkedListNode
	Value interface{}
}

func (node *SinglyLinkedListNode) Next() *SinglyLinkedListNode {
	return node.next
}

type SinglyLinkedList struct {
	head   *SinglyLinkedListNode
	length int
}

func (node *SinglyLinkedList) Front() *SinglyLinkedListNode {
	return node.head
}

func (list *SinglyLinkedList) Add(value interface{}) {
	list.head = &SinglyLinkedListNode{list.head, value}
	list.length++
}

func main() {

	// 単方向連結リスト
	slist := SinglyLinkedList{}
	slist.Add("さしすせそ")
	slist.Add("かきくけこ")
	slist.Add("あいうえお")

	// 順番に取得
	for e := slist.Front(); e != nil; e = e.Next() {
		fmt.Printf("%v\n", e.Value)
	}

	// 双方向連結リスト
	dlist := list.New()
	dlist.PushBack("あいうえお")
	dlist.PushBack("かきくけこ")
	dlist.PushBack("さしすせそ")

	// 順番に取得
	for e := dlist.Front(); e != nil; e = e.Next() {
		fmt.Printf("%v\n", e.Value)
	}

	// 逆順に取得
	for e := dlist.Back(); e != nil; e = e.Prev() {
		fmt.Printf("%v\n", e.Value)
	}
}