Go에서 연결 리스트 구현하기
Daniel Hayes
Full-Stack Engineer · Leapcell

Key Takeaways
- Go의 연결 리스트는 더 깊은 이해를 위해 처음부터 구현하거나 Go의
container/list
패키지를 사용하여 구현할 수 있습니다. - 단일 연결 리스트의 수동 구현은 효율적인 삽입 및 삭제를 위해 노드 참조를 관리하는 것을 포함합니다.
- Go의 표준 라이브러리는 일반적인 작업에 편리한 메서드를 제공하는 이중 연결 리스트를 제공합니다.
연결 리스트는 컴퓨터 과학의 기본 데이터 구조로, 각 요소는 노드라고 하며 데이터와 시퀀스의 다음 노드에 대한 참조(또는 링크)를 포함합니다. 배열과 달리 연결 리스트는 메모리에 요소를 연속적으로 저장하지 않습니다. 대신 각 노드는 다음 노드를 가리키므로 전체 데이터 구조를 재구성하지 않고도 효율적인 삽입 및 삭제 작업을 수행할 수 있습니다.
연결 리스트의 유형
연결 리스트에는 여러 가지 변형이 있습니다.
-
단일 연결 리스트: 각 노드는 데이터와 다음 노드에 대한 참조를 포함합니다.
-
이중 연결 리스트: 각 노드는 데이터, 다음 노드에 대한 참조 및 이전 노드에 대한 참조를 포함합니다.
-
원형 연결 리스트: 마지막 노드가 첫 번째 노드를 다시 가리키며 원을 형성합니다.
Go에서 단일 연결 리스트 구현하기
Go의 표준 라이브러리는 이중 연결 리스트를 구현하는 container/list
패키지를 제공합니다. 그러나 처음부터 단일 연결 리스트를 구현하는 방법을 이해하면 Go의 포인터 및 메모리 관리에 대한 더 깊은 통찰력을 얻을 수 있습니다.
노드 구조 정의
단일 연결 리스트의 각 노드는 정수 값과 다음 노드에 대한 참조를 보유합니다.
type Node struct { data int next *Node }
연결 리스트 구조 정의
연결 리스트 자체는 헤드 노드에 대한 참조를 유지하고 길이를 추적합니다.
type LinkedList struct { head *Node length int }
헤드에 삽입
리스트의 시작 부분에 새 노드를 삽입하려면:
func (l *LinkedList) InsertAtHead(data int) { newNode := &Node{data: data, next: l.head} l.head = newNode l.length++ }
꼬리에 삽입
리스트의 끝에 새 노드를 삽입하려면:
func (l *LinkedList) InsertAtTail(data int) { newNode := &Node{data: data} if l.head == nil { l.head = newNode } else { current := l.head for current.next != nil { current = current.next } current.next = newNode } l.length++ }
노드 삭제
값으로 노드를 삭제하려면:
func (l *LinkedList) Delete(data int) { if l.head == nil { return } if l.head.data == data { l.head = l.head.next l.length-- return } current := l.head for current.next != nil && current.next.data != data { current = current.next } if current.next != nil { current.next = current.next.next l.length-- } }
리스트 순회
리스트를 순회하고 인쇄하려면:
func (l *LinkedList) PrintList() { current := l.head for current != nil { fmt.Println(current.data) current = current.next } }
Go의 container/list
패키지 사용
실용적인 애플리케이션의 경우 Go의 container/list
패키지는 이중 연결 리스트의 강력한 구현을 제공합니다.
package main import ( "container/list" "fmt" ) func main() { l := list.New() l.PushBack(1) l.PushBack(2) l.PushFront(0) for e := l.Front(); e != nil; e = e.Next() { fmt.Println(e.Value) } }
이렇게 하면 다음이 출력됩니다.
0
1
2
container/list
패키지는 즉시 사용할 수 있는 이중 연결 리스트를 제공하며, 양방향 순회 기능으로 인해 특정 작업에 더 효율적일 수 있습니다.
결론
Go에서 연결 리스트를 구현하면 포인터와 동적 데이터 구조에 대한 귀중한 경험을 얻을 수 있습니다. Go의 표준 라이브러리가 container/list
패키지를 통해 이중 연결 리스트를 제공하지만 기본 구현 세부 정보를 이해하면 개발자가 이러한 데이터 구조를 효과적으로 사용해야 하는 시기와 방법에 대해 정보에 입각한 결정을 내릴 수 있습니다.
FAQs
연결 리스트는 메모리를 재할당하지 않고 효율적인 삽입 및 삭제를 제공합니다.
새 노드를 만들고 next
를 현재 헤드를 가리키도록 하고 헤드를 새 노드로 업데이트합니다.
간소화된 작업을 통해 강력한 기본 제공 이중 연결 리스트가 필요한 경우.
Go 프로젝트 호스팅을 위한 최고의 선택, Leapcell입니다.
Leapcell은 웹 호스팅, 비동기 작업 및 Redis를 위한 차세대 서버리스 플랫폼입니다.
다국어 지원
- Node.js, Python, Go 또는 Rust로 개발하십시오.
무료로 무제한 프로젝트 배포
- 사용량에 대해서만 지불하십시오. 요청도 없고 요금도 없습니다.
탁월한 비용 효율성
- 유휴 요금 없이 사용한 만큼만 지불하십시오.
- 예: $25는 평균 응답 시간 60ms에서 694만 건의 요청을 지원합니다.
간소화된 개발자 경험
- 간편한 설정을 위한 직관적인 UI
- 완전 자동화된 CI/CD 파이프라인 및 GitOps 통합.
- 실행 가능한 통찰력을 위한 실시간 메트릭 및 로깅.
손쉬운 확장성 및 고성능
- 높은 동시성을 쉽게 처리하기 위한 자동 확장
- 운영 오버헤드가 전혀 없으므로 구축에만 집중하십시오.
설명서에서 더 자세히 알아보세요!
X에서 팔로우하세요: @LeapcellHQ