간단하게 Add, Remove, Get, GetAll 4가지의 함수를 가지고 있는 List를 구현했다
package list
// List 구조체를 선언합니다.
type List struct {
head *Element // 제일 앞에 있는 Element 입니다.
tail *Element // 제일 뒤에 있는 Element 입니다.
length int // List의 전체 길이를 저장합니다
}
// Element 구조체를 선언합니다. Element는 List에 들어갈 하나의 아이템 입니다
type Element struct {
Value interface {} // 어떤 데이터 타입이든 넣을 수 있도록 interface{}로 선언합니다
next *Element // 다음 Element 를 바라보고 있는 포인터 변수입니다.
prev *Element // 이전 Element 를 바라보고 있는 포인터 변수입니다.
}
// New 새로운 List 구조체를 생성하고 초기화 합니다
func New() *List {
list := &List{} // 새로운 List 구조체의 인스턴스 생성합니다
list.length = 0 // 새로 생성된 List의 length를 0으로 초기화합니다
return list
}
// Add list에 새로운 Element를 추가합니다
func (list *List) Add(value interface{}) {
// 추가 될 아이템은 항상 마지막에 추가 되므로, 다음 Element는 list의 맨 처음 값을 바라보고, 이전 Element는 list의 마지막 값을 바라봐야 합니다.
newItem := &Element{value,list.head,list.tail}
if list.head == nil { // list의 head가 비어있다는 것은 아무 값이 없다는 뜻이기 때문에 head와 tail을 새로운 아이템으로 초기화 합니다
list.head = newItem
list.tail = newItem
}else { // 기존의 아이템이 있을때는 아래와 같이 값을 변경합니다
list.tail.next = newItem // 기존에 있던 tail의 이전값을 새로운 아이템으로 변경합니다
list.head.prev = newItem // 기존에 있던 head의 이전값을 새로운 아이템으로 변경합니다
list.tail = newItem // list의 맨 마지막 값이 변경되었기 때문에 현재 아이템으로 tail을 변경합니다
}
list.length += 1
}
// Remove list에 Element를 삭제합니다
func (list *List) Remove(index int) {
currentNode := getCurrentNode(list,index) // index의 노드를 가져옵니다
currentNode.prev.next = currentNode.next // 현재 노드의 이전 노드 다음값을 다음 값으로 변경합니다
currentNode.next.prev = currentNode.prev // 현재 노드의 다음 노드 이전값을 이전 값으로 변경합니다
list.length -= 1 // 삭제되었기 때문에 길이를 하나 줄입니다
}
// Get list에서 값을 하나 가져옵니다
func (list *List) Get(index int) interface{} {
currentNode := getCurrentNode(list,index) // index의 노드를 가져옵니다
return currentNode.Value // 값을 출력합니다
}
func (list *List) GetAll() []interface{} {
var result []interface{} // 결과 값을 저장할 interface를 선언합니다
currentNode := list.head // 맨 처음 노드를 가져옵니다
// 모든 노드를 순회하고 value 값을 result에 추가합니다
for i:=0; i<list.length; i++ {
result = append(result, currentNode.Value)
currentNode = currentNode.next
}
return result
}
// getCurrentNode list의 index 값으로 노드를 가져옵니다
func getCurrentNode(list *List,index int) *Element {
currentNode := list.head
for i:=0; i<index; i++ {
currentNode = currentNode.next
}
return currentNode
}