제목 설명
링크 된리스트, 링이 포함하는 경우, 엔트리 링 노드리스트를 검색하며, 그렇지 않은 경우, 널 (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 = 브로; } }