이중 연결 리스트 (list)

이중 연결 리스트 (list)

Go는 이중 연결 리스트 (Doubly Linked List)를 표준 패키지에서 지원하고 있는데, 이를 사용하기 위해 “container/list”를 import 해서 사용한다.

Go에서 순차적 동적 자료구조로서 슬라이스가 많이 사용되는데, 이중 연결 리스트는 리스트 중간에 요소를 동적으로 추가,삭제하는 일이 빈번한 경우 슬라이스보다 유용할 수 있다.

이중 연결 리스트를 새로 생성하기 위해서는 list.New() 메서드를 사용하면 되는데, 이 메서드는 리스트를 만들고 그 포인터를 리턴한다. 이후 리스트 포인터를 사용하여 새로운 요소를 리스트 맨 뒤에 추가하거나(PushBack) 맨 앞에 추가할 (PushFront) 수 있다. 또한 중간에 요소를 추가하기 위해 InsertBefore() 혹은 InsertAfter()를 호출할 수 있다.

package main

import (
	"container/list"
	"fmt"
)

func main() {
	//새 이중 연결 리스트 생성
	mylist := list.New()

	// 리스트 요소 추가
	mylist.PushBack("A")
	mylist.PushBack(100)
	mylist.PushBack(true)
	mylist.PushFront("A")

	// 리스트 Iteration
	for e := mylist.Front(); e != nil; e = e.Next() {
		fmt.Println(e.Value)
	}
}

여기서 한가지 주목할 것은 리스트 요소(Element)에는 모든 타입의 데이타를 혼용하여 넣을 수 있다는 점이다. 즉, 위의 예제에서 문자열 A/B, 숫자 100, 부울린 true 등 다양한 타입의 데이타를 리스트 요소에 추가할 수 있었다. 이는 리스트 요소인 Element.Value 타입이 모든 타입을 사용할 수 있는 interface{}으로 정의되어 있기 때문인데, 따라서 list는 strongly typed 컨테이너라 볼 수 없다.