2016-11-20 2 views
1

다음과 같이 링크 된 목록에주기가 있는지 확인하는 구현이 있습니다. true이면 true를 반환하고 그렇지 않으면 false를 반환합니다.연결된 목록에 Java주기가 있는지 확인하는 방법?

코드가 정확하다고 보이지만주기가 있어도 false가 반환됩니다. 내가 뭘 놓치고 있니? 목록주기, 가 있거나 다른 사람의 끝에 도달하면 walker 한 단계 및 2 단계로 진전 runner에 의해 발전 는 결국 만날 것입니다 : 알고리즘은 참으로 정확 당신에게

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

감사 명부.

이주기 탐지 구현은 노드 값에 대한 사이클을 감지하지 않지만 노드는으로 표시됩니다. 더주기는 노드의 관점에서 여기가 없습니다 :

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

관련 문제