Golang으로 양방향 연결 리스트 구현해보자

코딩하는범이·2021년 10월 31일
0
post-thumbnail

간단하게 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
}
profile
기록 그리고 기억

0개의 댓글