인 경우 연결된 목록에 루프가 있는지 찾아보십시오. 빠른 포인터와 느린 포인터를 사용하는 대신 다른 방법이 있습니까? ?두 개의 포인터가없는 연결된 목록의 루프가
답변
상황에 따라이를 수행 할 수있는 다양한 방법이 있습니다.
도달 할 때 어떤 종류의 세트에 각 노드를 추가하십시오. 끝까지 도달하거나 세트에 이미있는 노드를 찾을 때까지 목록을 살펴보십시오.
노드에 여유 공간이있는 경우 각 노드를 "방문한"것으로 표시하거나 표시하지 않고 이미 마크 한 노드를 찾을 때까지 목록을 이동할 수 있습니다. 두 포인터 방법은 추가 메모리를 사용하여 거의 모든 곳에서 적용하지 않는 동안
이
은 물론, 모두가 그들이 사용할 수없는 것 (높은 메모리 사용 등) 단점이나 상황이있다.각 노드를 방문한 것으로 표시하고 이미 방문한 노드가 있음을 감지해야합니다. 문제는 그것을 표시 할 것이므로 목록을 실행하여 전후의 모든 것을 재설정 할 필요가 없습니다.
약간의 추가적인 참조 해제없이 전체 목록을 다시 가로 질러 노드를 재설정하는 것을 피할 수 있습니다. 예 : visool1과 visited2라는 두 개의 변수가 있습니다. visited1 = false 및 visted2 = true를 초기화합니다. 검사를 시작하기 전에 모든 노드가 visited1을 가리키고 visited1 = false를 가리 킵니다. 이제 방문한 각 노드에 대해 visited2를 가리 키도록하십시오. 방문 링크가 "true"를 가리키는 노드를 발견하면 루프가 있습니다. 이제 링크 목록을 재설정하기 위해 visited1과 visted2의 값을 토글합니다. – LionHeart
이전 솔루션에서 말한 것처럼, 방문한 노드를 어떻게 든 표시해야합니다. 실제로 모든 단일 링크 목록 노드에서 모든 메모리 주소가 8의 배수이기 때문에 "next"포인터에 적어도 3 비트의 여유 공간이 있습니다. 따라서 해킹을 조금 할 수 있으며 마지막으로 예를 들어 설정할 수 있습니다 링크 된리스트에서 전진 할 때 '다음'포인터의 마지막 비트를 가려서 유효한 메모리 주소를 가져야합니다.
- 1. 두 개의 연결된 목록의 드문 요소를 얻는 방법은 무엇입니까?
- 2. MySQL의 - 두 개의 연결된 테이블
- 3. 두 개의 연결된 테이블에 게시
- 4. 연결된 목록의 항목 이동
- 5. 연결된 목록의 속도가 빨라 졌습니까?
- 6. 연결된 테이블에 두 개의 드롭 목록 추가
- 7. JQgrid : 두 개의 연결된 선택 드롭 다운
- 8. 연결된 목록의 알고리즘 복잡도 분석
- 9. 연결된 목록에 루프가 있는지 여부를 확인하는 방법?
- 10. 연결된 목록의 개체/상속 된 클래스 사용
- 11. For 루프가 두 번 실행됩니다.
- 12. 함수 포인터가없는 콜백
- 13. 클래스 포인터가없는 C- 콜백
- 14. 두 배로 연결된 목록 Java
- 15. 두 목록의 항목을 결합하다
- 16. C# : 연결된 목록의 역 열거 자 액세스
- 17. 이중 연결된 목록의 복사본을 만드는 방법은 무엇입니까?
- 18. 연결된 목록의 동작을 사용하여 jquery-sortable
- 19. 연결된 목록의 내용을 파일에 쓰는 방법
- 20. 각 반복에서 목록의 두 개의 연속 값 사용
- 21. 두 개의 R 명명 된 목록의 차이점을 얻으려면 어떻게해야합니까?
- 22. 하나의 항목으로 연결된 두 개의 속성 값 반환
- 23. 두 개의 연결된 NSStrings 사이에 공백을 추가하려면 어떻게합니까?
- 24. LINQ와 연결된 두 개의 DataTable에서 결합 된 DataTable을 만듭니다. C#
- 25. C#의 한 파일과 연결된 두 개의 CryptoStreams
- 26. 두 개의 포인터를 사용하여 링크 목록에 루프가 있는지 찾는 방법은 무엇입니까?
- 27. 인터뷰 : 두 개의 연결된 목록에서 비슷한 요소 찾기 및 연결된 목록으로 결과 반환
- 28. 단일보기와 연결된 여러 개의 ViewModels
- 29. foreach 루프가 목록의 모든 항목을 반복하지 않습니다. - C#
- 30. 포인터가없는 C++의 순환 참조
왜 두 개의 포인터를 사용하고 싶지 않으십니까? –