항목 목록 노드 목록이 제공 (55) 중앙 승리

제목 설명

링크 된리스트, 링이 포함하는 경우, 엔트리 링 노드리스트를 검색하며, 그렇지 않은 경우, 널 (null)로 출력한다.
 

문제 해결 아이디어


첫 번째 단계는 싱크 반지를 찾을 수 있습니다. 각각 P1,리스트의 선두 P1 각 보행 단계 점 P2, P2 각각은 상기 링 위상 P1, P2 == 찾기 싱크까지 두 단계를 수행.

두 번째 단계는, 입구 링을 발견한다. P1 == P2, P2는 2 배 내지 노드의 개수가 일 때 접속하는 단계는, P1은 X, 링 n 개의 노드들, 복수의 2 배 =로 걷는보다 P2를 P1 거기 제공되는 노드의 수이고, N + X, N = X; P1 케이스 향하는 입구 링, P1은 단계들의 개수가 실제적으로 목록의 헤드 동일한 위치 P1, P1, P2 P1 == P2 단계까지 각 패스 있도록, P2 지점 고리를 걸어 것을 알 수있다.

 

다음 코드는

공개 ListNode EntryNodeOfLoop (ListNode pHead) 
    { 
        
        ListNode listNode1 = pHead; 
        ListNode listNode2 = pHead;
        시도 {
             INT의 플래그 = 0 ;
            반면 (pHead.next =! ) {
                 경우 (listNode1 == pHead) { 
                    플래그 ++ ;
                    경우 (플래그> = 2 ) {
                         반환  ; 
                    } 
                } 
                listNode1 =listNode1.next; 
                listNode2 = listNode2.next.next;
                경우 (listNode1 == listNode2) { 
                    listNode2 = pHead;
                    반면 (! = listNode1 listNode2) 
                    { 
                        listNode1 = listNode1.next; 
                        listNode2 = listNode2.next; 
                    } 
                    경우 (listNode1 == listNode2) {
                         반환 listNode1 단계; 
                    } 
                    
                    
                    
                    
                    반환 listNode1을;    
                }
                
                
            } 
        } 캐치 (NullPointerException이 전자) {
             반환  널 (null) ; 
        } 
        반환  널 (null)을 ; 
        
    } 
    공용  클래스 ListNode {
         INT 발; 
         ListNode 다음 = 널 (null) ; 
 
         ListNode ( INT의 발) {
               .val = 브로; 
         } 
        
     }

 

추천

출처www.cnblogs.com/Transkai/p/11407664.html