ホームページ > バックエンド開発 > Golang > golangでリンクリストを実装する方法

golangでリンクリストを実装する方法

PHPz
リリース: 2023-04-13 09:57:17
オリジナル
1783 人が閲覧しました

リンク リストは一連のノードで構成される一般的なデータ構造で、各ノードにはデータと次のノードへのポインターが含まれます。この記事では、Go 言語を使用して簡単なリンク リストを実装します。

1. ノード タイプの定義

最初に、ノード タイプを定義する必要があります。ノードにはデータ要素と次のノードへのポインタが含まれている必要があります。コードは次のとおりです。

type Node struct {
    Data interface{} //节点存储的数据
    Next *Node       //指向下一个节点的指针
}
ログイン後にコピー

インターフェース{}を使用してノード データを保存します。これにより、リンク リストにあらゆる種類のデータを保存できるようになります。

2. リンク リスト タイプを定義する

次に、リンク リスト タイプを定義する必要があります。これには、最初のノードへのポインタが含まれている必要があります。同時に、AddNode と Traverse という 2 つのメソッドも追加しました。

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 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート