포인터 속도 : 이중 포인터. 목록에서 제공하는 두 포인터, 목록 동기화를 통과하지 않습니다. 우리는 두 개의 포인터 사이의 필요한 거리를 제조 할 수있다.
샘플의 변화에 의해 순수 테스트 표면 제목만큼 목록이 라인으로 이루어지는 루프가 있는지 여부에 의해 판단한다.
A는 생각 : 해시
대부분의 가능성이 아이디어 목록이 방문 할 때마다 해시,해야한다고 생각하고, 해시 테이블에 기록 넣어, 반복 방문의 링리스트의 노드, 약간의 코드가있을 때.
생각이 : 포인터의 속도
빠르고 느린 두 개의 포인터, 각각 2 단계를 제공. 목록 빠른 배 빠른 속도가 느린 같은 의미 활주로에 비해합니다. 반지 몇 시간 후 천천히 조만간 전체 회전보다 더 빨리,하지 NULL로 신속하게 빠르게 액세스 할 수 있지만, 빠른 속도, 즉, 목록에 존재하면 두 개의 포인터 것이다 다시 만나 (빠른 == 느린).
1 급 솔루션 { 2 공개 : 3 부울 hasCycle (ListNode * 헤드) { 도 4 의 경우 (NULL == 헤드 || == NULL 헤드 -> 다음) 5 리턴 거짓 ; 6 7 ListNode * = 느린 헤드; 8 ListNode * = 빠른 헤드; 9 (10) 동안 (NULL = 빠른 && = NULL이 빠른>! 다음) 11 { 12 빠른이 빠른 =>하는 next-> 다음; 13 천천히 느리게 => 다음; 14 의 경우 (빠른 ==) 천천히 (15) 수익을 사실 ; 16 } 17 반환 거짓 ; 18 } 19 };
포인터가 빠르고 느린 포인터 포인트를 정확히 중간 노드 목록의 끝에 도달 할 때 포인터의 빠른 속도가 두 배 느린 포인터이다.
1 급 솔루션 { 2 공개 : 3 ListNode * middleNode (ListNode * 헤드) { 4 ListNode * = 느린 헤드; 5 ListNode * = 빠른 헤드; (6) 의 경우 (NULL == 헤드 || == NULL 헤드 -> 다음) 7 복귀 헤드; 8 동안 ( 1 ) (9) { 10 빠른이 빠른 => 다음; 11 의 경우 (NULL이 빠른 ==> 다음) 12 리턴 슬로우> 다음; 13 천천히 느리게 =>다음 것; 14 빠른이 빠른 => 다음; 15 만약 (이 빠른> 다음 == NULL) (16) 반환 느린; 17 } 18 } 19 };
상호 LeetCode (19)는 N 노드 목록 삭제 매체
N은 포인터가 빠르게 포인터 전의 N-th 요소의 빠르고 느린 점 바로 포인터의 끝에 도달 할 때 빠른 포인터를 제하고, 동일한 속도로 목록을 통과되도록 단계.
1 급 솔루션 { 2 공개 : 3 ListNode * removeNthFromEnd (ListNode * 헤드 INT의 N) { 4 ListNode * = 느린 헤드; 5 ListNode * = 빠른 헤드; 6 대 ( INT가 나는 = 0 ;! I = N; ++ I) 7 빠른이 빠른 => 다음; 8 경우 (NULL == 빠른) 9 반환 머리 -> 다음; 10 동안 (NULL! =이 빠른> 다음) 11 { 12 빠른 =이 빠른> 다음; 13 천천히 느리게 => 다음; 14 } 15 슬로우> 다음 = 슬로우>하는 next-> 다음; 16 리턴 헤드; 17 } 18 };