LeetCode - указатель скорости

Скорость указателя: двойной указатель. Два указателя , представленные в списке, список не пройти синхронизацию. Мы можем изготовить требуемое расстояние между двумя указателями.

 

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 };
Просмотр кода

рекомендация

отwww.cnblogs.com/CofJus/p/11992789.html