2

リンクされたリストのデータ型を作成しているため、現在、最初の項目を参照する標準のヘッド ポインターと、次の項目を指す各要素の次のポインターがあり、最終的な要素が next = NULL になるようになっています。

最後のノードを追跡するための長所/短所、またはベストプラクティスが何であるかに興味があります. 常に最後のノードを指す「テール」ポインターを使用して追加を簡単にすることも、ヘッドポインターから始まるリストをループして、追加したいときに最後のノードを見つけることもできます。どの方法が良いですか?

4

2 に答える 2

4

通常、尻尾を保管することをお勧めします。最後にアイテムを追加する複雑さを考えると (これが一般的に行う操作である場合)、末尾を検索するのに O(n) 時間、保存する場合は O(1) 時間かかります。

考慮できる別のオプションは、リストを二重にリンクすることです。このようにリストの末尾を削除したい場合、tail を格納することで O(1) 時間でノードを削除できます。ただし、これにより、リストの要素ごとに格納される追加のポインターが発生します (高価ではありませんが、合計されるため、メモリに制約のあるシステムの考慮事項にする必要があります)。

最終的には、必要な操作がすべてです。リストの最後に追加したり削除したり操作したりしない場合は、これを行う理由はありません。最も一般的な操作の複雑さを分析し、それに基づいて決定することをお勧めします。

于 2013-09-17T16:51:05.063 に答える
1

最後のノードを見つける必要がある頻度によって異なりますが、一般的にはtailポインタを持つことが最善です。

ポインターを保持して更新するだけのコストはほとんどありtailませんが、忘れずに更新する必要があります。更新し続けることができれば、追加操作がはるかに高速になります (O(1)の代わりにO(n))。したがって、通常リストの最後に要素を追加する場合は、絶対にtailポインターを作成して維持する必要があります。

すべての要素に要素next prev要素の両方へのポインターが含まれる双方向リンク リストがある場合、tailポインターはほぼ普遍的に使用されます。

一方、これがソートされたリストの場合、最後に追加しないため、tailポインターは使用されません。それでも、将来必要になった場合に備えて、ポインターを保持しておくことをお勧めします。

于 2013-09-17T16:53:01.267 に答える