Обычное решение, которое я нахожу для этой проблемы, состоит в том, чтобы использовать 2 указателя, которые продвигались по связанному списку с разными интервалами (т. е. чтобы p1 проходил по одному узлу за раз, а p2 — по два узла за раз) до тех пор, пока p1 и p2 не сравняются. Пример: Поиск цикла в односвязном списке
Но почему мы не можем просто использовать Set, чтобы увидеть, есть ли дубликаты узлов (при условии, что наши узлы не имеют своих равных по умолчанию и перезаписанных hashCode).