2017-08-10 5 views
1

私は現在、以前のデータ構造の知識を再学習しており、HackerRankなどの問題に取り組むことに決めました。私はリンクされたリストでサイクルを検出する必要がある簡単な質問に出くわしましたが、私が間違っていることを理解できないようです。私は他の答えを見て、その構文とロジックを理解しましたが、私のコードが失敗するロジックを見つけることができないようです。私のコードでエラーがありますか? (リンクされたリスト内のサイクル)

boolean hasCycle(Node head) { 

    if (head == null || head.next == null){ 
     return false; 
    } 

    Node first = head; 
    Node second = head.next; 

    while (second != null){ 
     if (first == second) 
     { 
      return true; 
     } 
     first = first.next; 
     second = second.next.next; 
    } 
    return false; 
} 
+0

サイクルではどういう意味ですか? –

+0

最初の「尾」ノードが頭を指している、循環リンクリストの代わりに、完全なリンクリストをチェックして、それが円形かどうかを確認します。サイクルがある場合は、1つのノードが別の前のノードをポイントする場所になります。問題を迫っています:https://www.hackerrank.com/challenges/ctci-linked-list-cycle –

+0

このプログラムは、デバッガで1行ずつ進めることができる程度に小さくなっています。 –

答えて

0

あなたのリストには、最初のノードだけでなく、どのノードでもサークルを持つことができます。あなたのコードは解決策から遠いです。 ノードが複数回訪問されたかどうかを確認する必要があるという問題の考え方を簡素化できます。 はこれを行うには、その後、あなたの関数は、私はあなたの関数のシグネチャとそれを解決し

boolean hasCycle(Node head) { 

Node first = head; 
while (first != null){ 
    if (visitedMoreThanOnce(first)) 
    { 
     return true; 
    } 
    first = first.next; 
} 
return false; 
} 

注意することができ、この

boolean visitedMoreThanOnce(Node head) 
{ 
    if (head.next == null){ 
     return false; 
    } 


    Node second = head.next; 

    while (second != null){ 
     if (head == second) 
     { 
      return true; 
     } 
     second = second.next; 
    } 
    return false; 
} 

のようなヘルパー関数を使用することができます。あなたの質問のコメントに含まれているリンクの問題を見ることで、頭がポインタになるはずです。その場合は、の代わりに->演算子を使用する必要があります。

+0

あなたはヘルパーを使うことができるなら、なぜヘルパーhasCycle(頭)を使わないのでしょうか?これは、これがハッカーブランクで不正行為と呼ばれると思いますか? :D - https://www.hackerrank.com/challenges/ctci-linked-list-cycleにあるようにリストの最大長は100です。 –

+0

ヘルパー用のコードを書きました。私はhackerrankのルールを知っていませんが、彼はwhileループ内でヘルパー関数に入れたコードを置くことができます。それは同じことです。私がやったやり方でもっと読みやすい。 –

+0

ああそこにあります。 =) - 100のリストの最大サイズについて何かしたいですか? –

関連する問題