141リンクリストサイクル - 簡単

それはそれでサイクルを持っている場合、リンクされたリストを考えると、決定します。

与えられたリンクされたリスト内のサイクルを表すために、我々は整数使用  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。
            場合(遅い== 速い){
                 戻り 
            } 
        } 
        を返す 
    } 
}

 

おすすめ

転載: www.cnblogs.com/fatttcat/p/11106519.html