2017-01-26 20 views
1

Я изучаю Floyd's Tortoise and Hare algorithm и пытаюсь смоделировать проблему, используя std :: forward_list. В частности, я хотел бы преднамеренно создать цикл с использованием std::forward_list и обнаружить его с помощью упомянутого алгоритма.Может ли цикл существовать в std :: forward_list?

(Per комментариев ниже, без взлома интерфейса,. То есть, использовать интерфейс std::forward_list создать цикл)

«Проблема» в том, что это не представляется возможными. Я рассмотрел конструкторы и методы мутаторов. Насколько я могу судить, интерфейс std::forward_list предотвращает появление таких циклов. Это, как правило, хорошо, если вы не подготовитесь к собеседованию и хотите намеренно внедрить forward_list с циклом: ^)

Можно ли создать цикл в std :: forward_list?

Список литературы:

How to detect a loop in a linked list?
http://en.cppreference.com/w/cpp/container/forward_list
http://codingfreak.blogspot.com/2012/09/detecting-loop-in-singly-linked-list_22.html

+1

Поскольку std :: forward_list обычно является шаблоном, вы можете создать код или шаблон, который непосредственно манипулирует указателями на внутренние узлы реализации, но нет способа сделать это, используя функции-члены std :: forward_list. В зависимости от того, как реализован std :: forward_list, вам, возможно, придется сделать копию, а затем отредактировать эту копию, чтобы получить доступ к указателям внутренних узлов. – rcgldr

+0

@ rcgldr thx. Мой вопрос непонятен, но я имею в виду создать цикл через предоставленный интерфейс для std :: forward_list. – kmiklas

+1

Поскольку у вас нет доступа к типу базового узла, и итератор - это просто переадресатор (что-то вроде), я не вижу, как это будет возможно. – Kevin

ответ

3

Интерфейс forward_listlist, в этом отношении) разработан специально, чтобы скрыть детали узлов и узлов указателей от пользователя. Они свободны от циклов по дизайну и абстракции.

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

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