Golang에서 연결리스트를 구현하는 방법

PHPz
풀어 주다: 2023-04-13 09:57:17
원래의
1771명이 탐색했습니다.

연결된 목록은 일련의 노드로 구성된 공통 데이터 구조이며, 각 노드에는 데이터와 다음 노드에 대한 포인터가 포함됩니다. 이번 글에서는 Go언어를 사용하여 간단한 연결리스트를 구현해보겠습니다.

1. 노드 유형 정의

먼저 노드 유형을 정의해야 합니다. 노드에는 데이터 요소와 다음 노드에 대한 포인터가 포함되어야 합니다. 코드는 다음과 같습니다.

type Node struct {
    Data interface{} //节点存储的数据
    Next *Node       //指向下一个节点的指针
}
로그인 후 복사

인터페이스{}를 사용하여 노드 데이터를 저장합니다. 이를 통해 연결된 목록이 모든 유형의 데이터를 저장할 수 있습니다.

2. 연결 목록 유형 정의

다음으로 연결 목록 유형을 정의해야 합니다. 여기에는 첫 번째 노드에 대한 포인터가 포함되어야 합니다. 동시에 AddNode와 Traverse라는 두 가지 메서드도 추가했습니다.

type LinkedList struct {
    Head *Node //指向第一个节点的指针
}

//添加一个节点
func (l *LinkedList) AddNode(data interface{}) {
    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
    }
}

//遍历链表并执行函数
func (l *LinkedList) Traverse(fn func(interface{})) {
    current := l.Head
    for current != nil {
        fn(current.Data)
        current = current.Next
    }
}
로그인 후 복사

AddNode 메소드는 연결 리스트의 끝에 노드를 추가합니다. 연결리스트가 비어 있으면 추가된 노드가 첫 번째 노드가 됩니다. 그렇지 않으면 연결된 목록을 탐색하여 마지막 노드를 찾고 새 노드를 다음 노드로 추가합니다.

Traverse 메소드는 콜백 함수를 사용하여 연결 리스트의 각 노드를 조작합니다. 연결된 목록의 각 노드를 반복한 다음 각 노드에서 전달된 함수를 실행합니다. 이 메서드를 사용하여 연결된 목록을 탐색하고 각 노드를 인쇄할 수 있습니다.

func main() {
    list := LinkedList{}
    list.AddNode("A")
    list.AddNode("B")
    list.AddNode("C")

    list.Traverse(func(data interface{}) {
        fmt.Println(data)
    })
}
로그인 후 복사

위 코드는 다음을 인쇄합니다.

A
B
C
로그인 후 복사

3. 노드 삭제

이제 연결된 목록에서 노드를 삭제하는 메서드를 추가해 보겠습니다.

//删除链表中的节点
func (l *LinkedList) RemoveNode(target interface{}) {
    if l.Head == nil {
        return
    }

    if l.Head.Data == target {
        l.Head = l.Head.Next
        return
    }

    current := l.Head
    for current.Next != nil {
        if current.Next.Data == target {
            current.Next = current.Next.Next
            return
        }
        current = current.Next
    }
}
로그인 후 복사

RemoveNode 메서드는 삭제할 노드를 식별하는 매개 변수를 사용하고 연결된 목록을 탐색하여 노드를 찾습니다. 노드가 발견되면 현재 노드의 다음 포인터를 변경하여 연결 목록에서 제거합니다. 연결된 목록이 비어 있거나 노드를 찾을 수 없으면 아무 작업도 수행되지 않습니다.

전체 코드:

package main

import "fmt"

type Node struct {
    Data interface{} //节点存储的数据
    Next *Node       //指向下一个节点的指针
}

type LinkedList struct {
    Head *Node //指向第一个节点的指针
}

//添加一个节点
func (l *LinkedList) AddNode(data interface{}) {
    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
    }
}

//遍历链表并执行函数
func (l *LinkedList) Traverse(fn func(interface{})) {
    current := l.Head
    for current != nil {
        fn(current.Data)
        current = current.Next
    }
}

//删除链表中的节点
func (l *LinkedList) RemoveNode(target interface{}) {
    if l.Head == nil {
        return
    }

    if l.Head.Data == target {
        l.Head = l.Head.Next
        return
    }

    current := l.Head
    for current.Next != nil {
        if current.Next.Data == target {
            current.Next = current.Next.Next
            return
        }
        current = current.Next
    }
}

func main() {
    list := LinkedList{}
    list.AddNode("A")
    list.AddNode("B")
    list.AddNode("C")

    //遍历链表
    list.Traverse(func(data interface{}) {
        fmt.Println(data)
    })

    //删除节点并再次遍历链表
    list.RemoveNode("B")
    list.Traverse(func(data interface{}) {
        fmt.Println(data)
    })
}
로그인 후 복사

위 코드는 다음과 같이 인쇄됩니다.

A
B
C
A
C
로그인 후 복사

4. 요약

이 기사에서는 Go 언어를 사용하여 간단한 연결 목록을 구현했습니다. 연결된 목록은 많은 알고리즘 및 소프트웨어 개발 시나리오에서 널리 사용되는 중요한 데이터 구조입니다. 실제 코드를 작성할 때 추가 기능 추가를 고려하고 성능을 평가하세요.

위 내용은 Golang에서 연결리스트를 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿