2

循環ポインターとテールポインターのいずれかを使用して二重リンクリストを作成することの利点/欠点は何ですか? deque を構築するのに適しているのはどれですか?

私の意見では、ノードの検索、挿入、および削除のすべてを行う点で、それらはほとんど同じです。唯一の違いは、テール ポインター二重リンク リストの場合、テール ポインターが最後のノードを指す必要があり、テールの後に新しいノードを挿入するたびに更新する必要があることです。さらに、循環リンクリストでは、最後のノードにリンクされた最初のノードがあり、その逆も同様ですが、テールポインターでは、head-> prev と tail-> の両方がヌルポインターを指しています。どちらも両端キューを構築するのに最適だと思います。すべては、プログラムをどのように実行したいかによって決まります。プログラムをヘッド ノードとテール ノードの間で高速に実行できるようにする場合は、循環アプローチを使用します。それ以外の場合は、テール ポインターで十分です。

それが私の質問への答えです。循環二重リンク リストをまだ作成していないため、マシン上でどのように動作するかについては経験がありませんが、テール ポインターと同じくらい高速になると思います。何か提案はありますか?そして、ご意見をお寄せいただきありがとうございます。

4

1 に答える 1

1

最初または最後から効率的に追加/削除でき、単純で統一されたデータ構造を使用するため、循環二重リンクリストがおそらく好まれます。

循環 dbl-linked リストを実装する最も簡単な方法は、他のすべてのノードと同じタイプの「head」ノードを保持することですが、常に「null」項目/値を持ち、次/前へのポインターを保持するためだけに使用されます。実際の「アイテムノード」。

リストが空の場合、head.next と head.prev は両方ともそれ自体を指します。

'head' と 'tail' が空のときに null になることを許可する tail-pointer バリアントとは対照的に、循環 dbl リンク リストのロジックはより単純です。これは、変更操作で「ヘッド」ポインターと「テール」ポインターの両方を潜在的に更新する必要があり、ロジックをより複雑にします。

ここでは名前付けが少し不明確です。以前headは「リスト ノード」を参照していましたが、「リスト」または「ノード」と呼ばれることもあります。

head.next -> first -> second -> ...
head.last -> last -> second-last -> ...

リストが空の場合:

head.next -> head
head.last -> head

リストに 1 つの項目がある場合:

head.next -> item -> head
head.last -> item -> head
于 2013-11-05T03:19:49.250 に答える