2016-11-20 5 views
1

リンクリストにサイクルがあるかどうかを確認する次の実装があります。そうであればtrueを返し、そうでなければfalseを返します。リンクされたリストにJavaでサイクルがあるかどうかをチェックする方法は?

コードが正しいようですが、サイクルがあってもfalseを返しています。私は何が欠けていますか?アルゴリズムは確かに正しいですあなた

import java.util.*; 

class ListNode { 
    int val; 
    ListNode next; 

    ListNode(int x) { 
     val = x; 
     next = null; 
    } 
} 

class LinkedListCycle { 
    boolean hasCycle(ListNode head) { 
     if(head == null) { 
      return false; 
     } 

     ListNode walker = head; 
     ListNode runner = head; 

     while(runner.next!=null && runner.next.next!=null) { 
      walker = walker.next; 
      runner = runner.next.next; 
      if(walker==runner) return true; 
     } 

     return false; 
    } 

    public static void main(String args[]) { 
     LinkedListCycle llc = new LinkedListCycle(); 

     ListNode ln = new ListNode(1); 
     ln.next = new ListNode(2); 
     ln.next.next = new ListNode(3); 
     ln.next.next.next = new ListNode(4); 
     ln.next.next.next.next = new ListNode(2); 
     ln.next.next.next.next.next = new ListNode(1); 

     System.out.println(llc.hasCycle(ln)); 
    } 
} 
+0

存在する場合、あなたがより良い、ケースを投稿したいですサイクルとそれはfalseを返します。 –

答えて

5

ありがとう: 一歩と2つの段階で進めrunnerによって進めwalker、 は最終的にリストがサイクルを持っている場合 、会うか、他の終わりに達するだろうリスト。

このサイクル検出の実装では、ノード値の点でサイクルを検出するが、ノードの点ではありません。 ここにはサイクルがノードの面ではありません。

ListNode ln = new ListNode(1); 
ln.next = new ListNode(2); 
ln.next.next = new ListNode(3); 
ln.next.next.next = new ListNode(4); 
ln.next.next.next.next = new ListNode(2); 
ln.next.next.next.next.next = new ListNode(1); 

次のように書かれている場合、あるでしょう:

ListNode ln = new ListNode(1); 
ln.next = new ListNode(2); 
ln.next.next = new ListNode(3); 
ln.next.next.next = new ListNode(4); 
ln.next.next.next.next = ln.next; 
+0

説明をありがとうございました。実際にノードの値は必要ですか?歩行者が最終的に走者に会うのはどうですか? –

+0

ノード値はデータです。データ構造のポイントは、いくつかのデータを含むことです。そうではありません。この練習では、無意味に見えるかもしれません。まあ、それは単に練習の仕方です。歩行者と走者は、あなたがより速い走者と一緒に走った場合と同じように、最終的にあなたを追い越します。 – janos

関連する問題