2009-11-25 3 views
4

Петля может встречаться в одиночном списке (SLL).
Чтобы удалить цикл в списке, сначала нам нужно определить цикл в SLL, а затем удалить цикл.Удаление петли в одиночном списке

Может ли кто-нибудь сказать, как удалить петлю в SLL с псевдокодом?
Можем ли мы это сделать, используя 3 указателя?
Есть ли альтернатива для выполнения задачи?

+0

Также см. Этот вопрос: http://stackoverflow.com/questions/34249/best-algorithm-to-test-if-a-linked-list-has-a-cycle – sharptooth

+0

[Алгоритмы поиска петли в SSL] (http://ostermiller.org/find_loop_singly_linked_list.html) [Решение для удаления цикла] (http://tekpool.wordpress.com/2006/09/29/linked-list-detect-a-cycle-in -a-связной список, и затруднительный весь цикл /) –

ответ

1

Существует много решений, которые вы просите. Один из самых простых, но неэффективных методов состоит в том, чтобы перевернуть список, сохранив при этом головной узел. Если вы вернетесь к головному узлу, вы знаете, что существует цикл.

Другой способ проверки - создать массив, содержащий int для каждого узла в списке, каждый раз, когда вы посещаете узел, увеличивайте его «соответствующее значение в массиве». Затем все, что вам нужно сделать, это проверить, есть ли значение в массиве более одного, а затем сравнить это с тем, где начинаются дополнительные итерации. Этот метод обнаруживает полные петли и небольшие петли. Надеюсь, это полезно.