タイトル説明
リンクリストが与えられたら、リンクリストにリングがあるかどうかを判断します。
リンクリストに次のポインタを継続的に追跡することで再び到達できるノードがある場合、リンクリストにリングがあります。特定のリンクリスト内のリングを表すために、整数posを使用して、リンクリストの終わりがリンクリストに接続されている位置を示します(インデックスは0から始まります)。posが-1の場合、リンクリストにリングはありません。注:posは、リンクリストの実際の状況を識別するためだけに、パラメーターとして渡されることはありません。
リンクリストにリングがある場合は、trueを返します。それ以外の場合は、falseを返します。
例1:
入力:head = [3,2,0、-4]、pos = 1
出力:true
説明:リンクリストにリングがあり、そのテールが2番目のノードに接続されています。
例2:
入力:head = [1,2]、pos = 0
出力:true
説明:リンクリストにリングがあり、そのテールが最初のノードに接続されています。
例3:
入力:head = [1]、pos = -1
出力:false
説明:リンクリストにリングがありません
分析
-
posパラメータについて
タイトルは、リンクリストのセットとposパラメータを示します。posパラメータの機能は、提供されたリンクリストにリングがあるかどうかを説明することです。リングがない場合、pos = -1なので、 posパラメーターは、コードの記述にほとんど影響を与えないため、無視できます。 -
循環リンクリストがあるかどうかを検出します。高速および低速のポインタを
使用します(ここでは、侵害の削除を参照)。つまり、円形の遊び場で無限に走る場合、片側が十分に速い場合は、亀と野ウサギのレースの原則を使用します。 、同じ場所で会うとき、2つは必然的に異なるラップになります。
コードは、速く動くポインターとゆっくり動くポインターとして具体化されます。ループがある場合、それは必然的にレースの原則に入ります。そうでない場合、ループはありません。
コード
public class Solution {
public boolean hasCycle(ListNode head) {
if(head == null || head.next == null){
return false;
}
ListNode slow = head;
ListNode quick = head.next;
while (slow!=quick){
if (quick == null || quick.next == null) return false;
slow = slow.next;
quick = quick.next.next;
}
return true;
}
}