それはそれでサイクルを持っている場合、リンクされたリストを考えると、決定します。
与えられたリンクされたリスト内のサイクルを表すために、我々は整数使用 pos
尾部が接続するリンクされたリスト内(0インデックスの)位置を表します。場合 pos
で -1
は、リンクされたリストにはサイクルがありません。
例1:
入力:ヘッド= [3,2,0、-4]、POS = 1つの
出力:真
説明:サイクルはテールが第2ノードに接続されたリンクリスト、です。
例2:
入力:ヘッド= [1,2]、POS = 0
出力:真
説明:サイクルは尾が最初のノードに接続するリンクされたリストです。
例3:
入力:ヘッド= [1]、POS = -1
出力:偽
解説:リンクリストにはサイクルがありません。
ファローアップ:
あなたは使用してそれを解決することができます O(1) (すなわち一定の)メモリを?
ダブルポインタ、リングが会うポインタの速度を示している場合、ポインタがすぐに実行する場合(ヌル)説明非環式
高速時の2つのステップを移動しながら、一度に2つのポインタ、高速および低速、先頭から、低速移動ワンステップの両方を使用します。リストにはサイクルが存在しない場合は、高速のポインタは、最終的に最後に到達します。高速では減速する等しい場合、それはサイクルは、trueを返すがありますを意味し、高速ではヌルを指しているまで、二つのポインタを動かし続けます。そうでない場合は、falseを返します。
時間= O(N)スペース= O(1)
/ ** *単一リンクリストのための定義。 *クラスListNode { * int型のval; * ListNode次。 * ListNode(INT X){ *ヴァル= X。 *次回= NULL; *} *} * / パブリック クラスソリューション{ パブリック ブールhasCycle(ListNodeヘッド){ 場合(ヘッド== NULL || head.next == NULL ){ 戻り 偽。 } ListNode遅い =ヘッド、高速= ヘッド。 しばらく(速い!= nullを!&& fast.next = NULL ){ 遅い = slow.next。 速い = fast.next.next。 場合(遅い== 速い){ 戻り 真。 } } を返す 偽。 } }