@Armitage89

Как проверить, зациклен ли односвязный список?

Всем доброго времени суток.

Задали мне недавно одну задачку, над которой маюсь уже несколько дней. Имеется односвязный список, который используется в многопоточной системе, и изменяется несколькими потоками. Нужно определить, является ли список зацикленным(последний элемент указывает на первый).

Вариант с приравниванием рефералов по двум маркерам аля на каждый оборот внешнего цикла, берущего i-й элемент, внутренним циклом выбираются и сравниваются все последующие рефералы, не подошел. Уже думал над "локальной интерпретацией" этой методы, где при выборке каждого последующего элемента из списка идет сравнение с последующими рефералами, но есть сомнения касательно правильности подхода.

Был бы благодарен за любые предложения касательно решения сей задачи.
  • Вопрос задан
  • 6064 просмотра
Решения вопроса 1
@Sk1talec
Фанат Java, Android и компьютерного зрения :)
Алгоритм следующий:
1) Каждый элемент списка помещаем в нашу обертку, одним из полей которой будет являться ThreadLocal переменная - флаг. Изначально флаг выключен.
2) Когда мы посещаем элемент, поднимаем флаг.
3) Если нашли поднятый флаг - список зациклен. Если уперлись в next==null - нет.

Если такое действие над списком нужно производить не 1 раз, тогда у поднятого флага должно быть 2 значения, которые мы чередуем при каждом запуске.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@gurinderu
java developer
Нельзя проверить зацикленность многопоточно поскольку это в любом случае не атомарная операция.
Придется делать доступ до метода синхронизированным. И дальше можно:
1. Сделать фиктивный флаг для каждого node что мы тут уже были
2. Пустить два итератора. Первый по правилу i=i+1, второй по правилу i=i+2. И если второй догонит первый, то у вас есть цикл.
3. Вариант с удалением ссылок на next.
Ответ написан
@UA3MQJ
Если бы знать количество элементов в цепочке, то проходя по ней и считая шаги уже можно было бы понять.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы