2017-01-26 4 views
1

플로이드의 Tortoise and Hare algorithm을 연구 중이며 std :: forward_list를 사용하여 문제를 모델링하려고합니다. 특히, std::forward_list을 사용하여 의도적으로주기를 만들고 싶다고 말하면서 고의로 그것을 감지하고 싶습니다.사이클이 std :: forward_list에 존재할 수 있습니까?

(인터페이스를 해킹하지 않고, 아래의 코멘트를 당;. 즉,주기를 만들기 위해 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

기본 노드 유형에 대한 액세스 권한이없고 반복자가 ForwardIterator 일 뿐이므로이 방법이 가능하지 않습니다. – Kevin

답변

3

(그 문제에 대한 및 list) forward_list의 인터페이스를 사용자의 노드와 노드 포인터의 세부 사항을 숨기도록 설계되었습니다. 그들은 디자인과 추상화에 의해 자유로 워집니다.

아니요, 그렇다고해서 부정한 목록을 만들 수있는 자유를주는 것은 아닙니다. splice을 사용해도 새 항목에 넣기 전에 이전 목록에서 항목을 제거하므로 수행하지 않습니다.

주기 탐지 알고리즘을 테스트하려면 사람들이 순환 검색을 수행 할 수 있도록 자체 목록 형식을 작성해야합니다.