コンピューター サイエンスの基本的なデータ構造であるリンク リストは、要素のシーケンスを表すためによく使用されます。特定のシナリオでは、リンク リストにループが含まれる可能性があり、最後のノードが前のノードを指し、循環構造が作成されます。このようなループの存在を特定することは、リンク リストを含むさまざまな操作にとって重要なタスクです。
ウサギとカメのアルゴリズムとしても知られるフロイドのサイクル発見アルゴリズムは、次の機能を提供します。リンクされたリスト内のループを検出する効率的な方法。このアルゴリズムは、リスト内で 2 つのポインター (参照) を異なる速度で移動する原理に基づいて動作します。
原理:
次の Java 関数は、Floyd のサイクル検索アルゴリズムを実装します。
<code class="java">boolean hasLoop(Node first) { if(first == null) // list does not exist..so no loop either return false; Node slow, fast; // create two references. slow = fast = first; // make both refer to the start of the list while(true) { slow = slow.next; // 1 hop if(fast.next != null) fast = fast.next.next; // 2 hops else return false; // next node null => no loop if(slow == null || fast == null) // if either hits null..no loop return false; if(slow == fast) // if the two ever meet...we must have a loop return true; } }</code>
Floyd のサイクル検索アルゴリズムには、次の利点があります。
以上がフロイドの循環探索アルゴリズムはリンクされたリスト内のループを効率的に検出しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。