Скорость указателя: двойной указатель. Два указателя , представленные в списке, список не пройти синхронизацию. Мы можем изготовить требуемое расстояние между двумя указателями.
LeetCode 141 круговой связанный список легко
Для тестирования поверхности заголовка чисто изменений в образце, до тех пор, как в списке определяется, есть ли петля сделана на линии.
А мысли: Hash
Скорее всего, думать, что идея должна быть хэширования, когда список для посещения, и поставить его записал в хэш-таблице, когда будет узел в списке кольца повторных посещений, код немного.
Мышление два: скорость указателя
Предоставление двух указателей, быстро и медленно, шаг 2, соответственно. Если список по сравнению с взлетно-посадочной полосой, что означает быстрый в два раза быстрее, чем медленно. Когда кольцо присутствует в списке, а затем быстро быстрый доступ к не NULL, но быстрая скорость, как быстро, медленно, рано или поздно, чем на один полный оборот, то есть, через некоторое время два указателя снова встретятся (быстро == медленно).
1 класс Решение { 2 общественности : 3 BOOL hasCycle (ListNode * головка) { 4 , если (NULL == глава || NULL == head-> следующая) 5 возвращение ложным ; 6 7 ListNode * = медленная головка; 8 ListNode * быстро = голова; - 10 в то время как (NULL = NULL , быстро && = быстро->! Далее) 11 { 12 быстро = быстро-> next-> следующий; 13 медленно = замедленное> рядом; 14 , если (быстро ==медленный) 15 возвращение правда ; 16 } 17 возвращение ложным ; 18 } 19 };
Список промежуточного узла LeetCode 876 легко
Быстрая скорость указателя в два раза медленнее, указатель, когда указатель достигает конца быстрый, медленный пунктов указатель списка точно промежуточного узла.
1 класс Решение { 2 общественности : 3 ListNode * middleNode (ListNode * головка) { 4 ListNode * медленно = голова; 5 ListNode * быстро = голова; 6 , если (NULL == NULL , глава || == head-> следующий) 7 возврата головки; 8 в то время как ( 1 ) 9 { 10 быстро = быстро-> следующая; 11 , если (NULL == быстро-> следующая) 12 возврата замедленное> следующая; 13 медленно = замедленное>следующий; 14 быстро = быстро-> следующая; 15 , если (быстро-> следующая == NULL) 16 возврат медленно; 17 } 18 } 19 };
Взаимное LeetCode 19 , чтобы удалить список N узлов среды
N шагов, так что быстро указатель первой, а затем траверс список с той же скоростью, когда указатель достигает конца быстро, медленно правой точек указатель на N-го элемента до быстрого указателя.
1 класс Решение { 2 общественности : 3 ListNode * removeNthFromEnd (ListNode * голова, ИНТ п) { 4 ListNode * медленно = голова; 5 ListNode * быстро = голова; 6 для ( междунар я = 0 ;! Я = п; ++ я) 7 быстро = быстро-> рядом; 8 , если (NULL == быстро) 9 возврат head-> следующий; 10 в то время как (NULL! = Быстро-> следующая) 11 { 12 быстро = быстро-> рядом; 13 медленно = замедленное> рядом; 14 } 15 замедленное> следующая = замедленное> next-> следующая; 16 возвращения головы; 17 } 18 };