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の前に置かれます。
リストに要素を挿入する方法を次の表に示します。
方法 | 関数 | |
---|---|---|
|
他の挿入関数によって提供されるマークポイントの後に要素を挿入します | |
|
他の挿入関数によって提供されるマークポイントの前に要素を挿入します。 | |
|
他のリスト要素を末尾に追加する | |
|
他のリスト要素を先頭に追加します |
リストから要素を削除する
リスト挿入関数の戻り値は、リスト要素の値と他のノードとの関係を記録する *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、カノン、正午、拳、高 | |
|
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 メンバーを使用して、リストに追加されたときの元の値を取得します。