こんにちは、プログラミング愛好家の皆さん!今日は、C#の中でもちょっと特殊だけど、とっても便利なデータ構造、LinkedList<T>についてお話しします。「リンクトリスト」って聞くと難しそうに感じるかもしれませんが、実はとてもシンプルで面白い概念なんです。
皆さんは、数珠を見たことがありますよね?あの珠がつながっている様子を想像してみてください。LinkedListは、まさにその数珠のような構造をしているんです!各要素(珠)が次の要素へのリンク(糸)を持っていて、それらが連なってリストを形成しています。
では、なぜこんな特殊な構造が必要なのでしょうか?その秘密は「効率的な挿入と削除」にあります。普通のリスト(List<T>)では、真ん中に新しい要素を挿入したり、削除したりするのに時間がかかりますが、LinkedListならあっという間!まるで数珠に新しい珠を追加したり、取り外したりするように簡単なんです。
自己紹介
私は新卒でFAシステムの開発会社に入社した2年目エンジニアです。(2024年時点)
私はC#とVBを学習中なのでブログを見返す用のメモ代わりに活用しています。私の知識を共有し、皆様の学習のサポートとなれば幸いです。
解説
それでは、具体的にLinkedList<T>がどのように動作するのか、簡単なコード例を見ながら詳しく見ていきましょう。
using System;
using System.Collections.Generic;
class Program
{
static void Main(string[] args)
{
// LinkedList<T>の作成
LinkedList<string> shoppingList = new LinkedList<string>();
// 要素の追加
shoppingList.AddLast("牛乳");
shoppingList.AddLast("パン");
shoppingList.AddFirst("卵"); // リストの先頭に追加
Console.WriteLine("買い物リスト:");
foreach (string item in shoppingList)
{
Console.WriteLine("- " + item);
}
// 中間への挿入
LinkedListNode<string> breadNode = shoppingList.Find("パン");
shoppingList.AddAfter(breadNode, "バター");
Console.WriteLine("\n更新された買い物リスト:");
foreach (string item in shoppingList)
{
Console.WriteLine("- " + item);
}
// 要素の削除
shoppingList.Remove("牛乳");
Console.WriteLine("\n最終的な買い物リスト:");
foreach (string item in shoppingList)
{
Console.WriteLine("- " + item);
}
}
}
このコードでは、買い物リストをLinkedList<string>で表現しています。
まず、AddLast()
メソッドを使って「牛乳」と「パン」をリストの末尾に追加し、AddFirst()
で「卵」をリストの先頭に追加しています。これらの操作は、数珠の端に新しい珠を追加するようなものです。
次に、Find()
メソッドでリスト内の「パン」を探し、その後ろに「バター」を追加しています。これは、AddAfter()
メソッドを使用して行います。この操作は、数珠の真ん中に新しい珠を追加するようなイメージです。
最後に、Remove()
メソッドで「牛乳」をリストから削除しています。これは、数珠から特定の珠を取り外すような感じです。
LinkedList<T>の素晴らしいところは、これらの挿入や削除の操作がとても高速に行えることです。普通のリスト(List<T>)では、真ん中に要素を挿入したり削除したりすると、その後ろのすべての要素を動かす必要がありますが、LinkedListではそんな手間はありません。
LinkedListの注意点
ただし、注意点もあります。LinkedListは、インデックスを使って直接要素にアクセスすることができません。つまり、「3番目の要素」といった指定ができないんです。必要な要素を見つけるには、先頭から順番に探していく必要があります。
利用場面
では、どんな時にLinkedList<T>を使うべきでしょうか?
- リストの中間に頻繁に要素を挿入したり削除したりする場合
- リストの両端(先頭と末尾)に頻繁にアクセスする場合
- 要素の順序が重要で、その順序を頻繁に変更する必要がある場合
一方で、以下の場合はList<T>の方が適しているかもしれません:
- インデックスを使って要素に直接アクセスする必要がある場合
- リストの長さを頻繁に調べる必要がある場合(LinkedListは長さの取得に時間がかかります)
まとめ
LinkedList<T>は、適切な場面で使うことで、プログラムの効率を大きく向上させることができる強力なツールです。ぜひ、実際にコードを書いて試してみてください。プログラミングの世界には、まだまだ面白いデータ構造がたくさんありますよ!
これからもC#の奥深い世界を一緒に探索していきましょう。
その他のListに関する記事一覧
-
C# List
【C#入門】Listの要素を検索する方法と実践例
-
C# List
【C#入門】Listに要素を追加する方法とAdd()メソッドの使い方
-
C# List
【C#入門】Listのソート方法と実践的な使用例
-
C# List
【C#入門】Listの初期化方法と基本的な使い方
-
C# List
【C#入門】Listの使い方について|要素の追加・削除・ソート・検索
-
C# List
C#のSynchronizedCollection
入門:スレッドセーフなコレクションの基本と活用法 -
C# List
C#のStack
入門:後入れ先出しデータ構造の基本と活用法 -
C# List
C#のQueue入門:先入れ先出しデータ構造の基本と活用法
-
C# List
C#のHashSet入門:効率的な重複なしコレクションの使い方
-
C# List
C#のList
(Concurrent Collections)入門:並行処理のための安全なデータ構造 -
C# List
C#のImmutableList入門:不変性がもたらす安全なプログラミング
-
C# List
C#のSortedList入門:自動整列するデータ構造の魅力
コメント