リストは、複数のノードで構成される非連続のストレージ コンテナです。ノードは、いくつかの変数を通じて相互の関係を記録します。リストを実装するには、単一リンク リスト、二重リンク リストなど、さまざまな方法があります。
 

Go 言語ではリストはコンテナ/リスト パッケージを使用して実装されますが、内部実装原理は二重リンク リストであり、リストは任意の位置に要素を効率的に挿入および削除できます。

初期化リスト

リストを初期化するには、New() 関数を使用する方法と var キーワード宣言を使用する方法の 2 つがあり、これら 2 つの方法の初期化効果は一貫しています。

1) コンテナ/リスト パッケージの New() 関数を使用してリストを初期化します。

变量名 := list.New()

2) varキーワード宣言によるリストの初期化

var 变量名 list.List

リストは、特定の要素タイプの制限がないという点で、スライスやマップとは異なります。したがって、リストの要素は任意のタイプにすることができますが、これは利便性をもたらすだけでなく、リストにインターフェイスを配置するなどのいくつかの問題も引き起こします型 {} の値を抽出した後、interface{} を他の型に変換すると、クラッシュが発生します。{}

リストに要素を挿入する

二重リンク リストは、キューの前または後ろからの要素の挿入をサポートしており、対応するメソッドは PushFront と PushBack です。

ヒント

これら 2 つのメソッドは *list.Element 構造を返します。挿入された要素を将来使用するために削除する必要がある場合は、Remove() メソッドを使用して *list.Element を介してのみ削除できます。このメソッドにより、削除がより効率的に行われます。もダブルリンクリストの特徴の一つです。

次のコードは、リストに要素を追加する方法を示しています。

l := list.New()

l.PushBack("最初")
l.PushFront(67) 

コードの説明は次のとおりです。

  • 1 行目では、リスト インスタンスを作成します。
  • 3行目ではリストの最後に最初の文字列が挿入されていますが、この時点ではリストは空であり、挿入後の要素は1つだけです。
  • 4行目では値67をリストに入れていますが、このときリストには既にfist要素が存在するので、要素67はfistの前に置かれます。

リストに要素を挿入する方法を次の表に示します。

方法 関数
InsertAfter(v interface {}, mark * Element) * Element
他の挿入関数によって提供されるマークポイントの後に要素を挿入します
InsertBefore(v interface {}, mark * Element) *Element
他の挿入関数によって提供されるマークポイントの前に要素を挿入します。
PushBackList(other *List)
他のリスト要素を末尾に追加する
PushFrontList(other *List)
他のリスト要素を先頭に追加します

リストから要素を削除する

リスト挿入関数の戻り値は、リスト要素の値と他のノードとの関係を記録する *list.Element 構造体を提供します。リストから要素を削除する場合、迅速に削除するためにこの構造体を使用する必要があります。

リスト操作要素:

package main

import "container/list"

func main() {
    l := list.New()

    // 末尾に追加
    l.PushBack("canon")

    // 先頭に追加
    l.PushFront(67)

    // 末尾に追加し、要素のハンドルを保存する
    element := l.PushBack("fist")

    // fistの後ろにhighを追加
    l.InsertAfter("high", element)

    // fistの前にnoonを追加
    l.InsertBefore("noon", element)

    // 使用
    l.Remove(element)
} 

コードの説明は次のとおりです。
6 行目ではリスト インスタンスを作成します。
9 行目は、リストの最後に文字列 canon を挿入します。
12 行目では、値 67 をリストの先頭に追加します。
15 行目では、リストの最後に文字列 first が挿入され、この要素の内部構造が要素変数に保存されます。
18 行目では、要素変数を使用して、要素の位置の後に上位文字列を挿入します。
行 21 では、要素変数を使用して、要素位置の前に正午の文字列を挿入します。
24行目で要素変数に対応する要素を削除します。

以下の表は、各操作後のリストの実際の要素を示しています。

リスト要素を操作するプロセス
操作内容 リスト要素
l.PushBack(“カノン”) カノン
l.プッシュフロント(67) 67、カノン
element := l.PushBack(“拳”) 67、カノン、拳
l.InsertAfter(“高”, element) 67、カノン、拳、高
l.InsertBefore(“正午”, element) 67、カノン、正午、拳、高
l.Remove(element)
67、カノン、正午、高
リストを反復処理します - リストの各要素にアクセスします

二重リンク リストのトラバースでは、先頭要素を取得するために Front() 関数と連携する必要があります。トラバース中は、要素が空でない限り、続行できます。トラバースのたびに、要素のコードは次のとおりです。

 l := list.New()

// 尾部に追加
l.PushBack("canon")

// 头部に追加
l.PushFront(67)

for i := l.Front(); i != nil; i = i.Next() {
    fmt.Println(i.Value)
} 

コード出力は次のとおりです。

67
canon

コードの説明は次のとおりです。

  • 1 行目では、リスト インスタンスを作成します。
  • 4 行目では、canon がリストの最後に置かれます。
  • 7 行目は 67 をキューの先頭に置きます。
  • 9 行目、for ステートメントを使用してトラバースします。ここで、i:=l.Front() は初期割り当てを意味します。これは最初に 1 回だけ実行され、false が返された場合、各ループで i != nil ステートメントの判定が行われます。 、それはループを終了することを意味し、それ以外の場合は i = i.Next() が実行されます。
  • 10 行目では、トラバーサルによって返された *list.Element の Value メンバーを使用して、リストに追加されたときの元の値を取得します。
 

「 Go言語リスト(一覧)」についてわかりやすく解説!絶対に観るべきベスト2動画

Golang リンク リスト – Golang データ構造
Golang のデータ構造 – リンクされたリスト (2/2)
https://www.youtube.com/watch?v=8QoynPUY9_8&pp=ugMICgJqYRABGAHKBSAgR2_oqIDoqp7jg6rjgrnjg4go5LiA6KanKSZobD1KQQ%3D%3D

Share via
Copy link