タグ付けされた質問 「linked-list」

7
リンクされたノード構造を不変にする実用的な方法はありますか?
単一リンクリストを作成することにし、内部リンクノード構造を不変にする計画を立てました。 しかし、私は思わぬ障害に遭遇しました。次のリンクされたノード(以前のadd操作から)があるとします。 1 -> 2 -> 3 -> 4 を追加したいと言います5。 これを行うには、ノード4は不変なので、の新しいコピーを作成する必要があります4が、そのnextフィールドをを含む新しいノードに置き換えます5。問題は3、古いものを参照していること4です。追加されていないもの5。今、コピーし3、そのnextフィールドを置き換えて4コピーを参照する必要がありますが、今2は古いものを参照してい3ます... または、言い換えると、追加を行うには、リスト全体をコピーする必要があるようです。 私の質問: 私の考えは正しいですか?構造全体をコピーせずに追加を行う方法はありますか? どうやら「効果的なJava」には推奨事項が含まれています。 クラスを変更可能にする非常に正当な理由がない限り、クラスは不変でなければなりません... これは可変性の良いケースですか? 私はリスト自体について話していないので、これは提案された答えの複製ではないと思います。これは明らかに、インターフェイスに準拠するために変更可能でなければなりません(新しいリストを内部に保持し、getterを介して取得するなどの操作を行わないでください。リストの内部が不変でなければならないかどうかについて話している。

5
短所リストが関数型プログラミングに関連付けられているのはなぜですか?
ほとんどの関数型言語は、最も基本的なリストタイプとして、一重リンクリスト(「コン」リスト)を使用していることに気付きました。例には、Common Lisp、Haskell、およびF#が含まれます。これは、ネイティブリストタイプが配列であるメインストリーム言語とは異なります。 何故ですか? Common Lisp(動的に型指定される)の場合、短所はリスト、ツリーなどのベースにもなるほど十分に一般的であるという考えがあります。これは小さな理由かもしれません。 ただし、静的に型付けされた言語の場合、正当な理由を見つけることができず、反論さえ見つけることができます。 機能的なスタイルは不変性を促進するため、リンクリストの挿入の容易さはあまり利点ではありませんが、 機能的なスタイルは不変性を促進し、データ共有も促進します。配列はリンクリストよりも「部分的に」共有しやすいため、 同様に、通常の配列でパターンマッチングを行うこともできますし、さらに優れています(たとえば、右から左に簡単に折りたたむことができます)。 さらに、ランダムアクセスが無料で得られます。 そして(実用的な利点)言語が静的に型付けされている場合、通常のメモリレイアウトを使用して、キャッシュの速度を上げることができます。 では、なぜリンクリストを好むのでしょうか?

4
配列の代わりにリンクリストを使用するための具体的なルールは何ですか?
リンクリストは、要素の安易な挿入と削除が必要な場合、および要素がメモリ内で隣接していないことが重要でない場合に使用できます。 これは非常に抽象的であり、配列ではなくリンクリストを使用する理由を具体的に説明したいと思います。私はプログラミングの経験があまりないので、実際の経験はあまりありません。

3
リンクリストには常にテールポインターが必要ですか?
私の理解... 利点: 最後に挿入すると、O(N)ではなくO(1)になります。 リストが二重リンクリストの場合、末尾から削除することもO(N)ではなくO(1)です。 不利益: わずかな量の4-8バイトの余分なメモリを占有します。 実装者は、テールを追跡する必要があります。 これらの長所と短所を見ると、リンクリストがテールポインターの使用を避ける理由がわかりません。私が欠けているものはありますか?
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.