article thumbnail image
Published 2021. 9. 25. 01:49

# Cycle Detection (Linked Lists)

[문제]

 

[코드]

bool has_cycle(SinglyLinkedListNode* head) {
    if(head == NULL) return 0;
    
    SinglyLinkedListNode* fast = head;
    SinglyLinkedListNode* slow = head;
    
    while(fast != NULL && fast->next != NULL)
    {
        slow = slow->next;
        fast = fast->next->next;
        
        if(fast == slow) return 1;
    }
    return 0;
}

 

[코드설명]

Linked List에서 cycle의 유무를 확인하는 문제다.

두 개의 포인터를 만들고, 하나는 +1만큼 다른 하나는 +2만큼 링크를 따라 이동시켰다.

두 포인터의 이동 간격이 +1 차이 나기 때문에 list에 cycle이 존재한다면 두 포인터가 n바퀴를 돌아 같은 노드에서 만나기 때문이다.

(하나의 포인터를 고정시키고 다른 하나를 +1만큼 이동시켰을 때 n바퀴를 돌아 같은 노드에서 만나는 것과 동일한 원리)

 

따라서 위 코드에서 fast==slow라면 cycle이 존재하는 것이다.

그렇지 않고 한 포인터가 NULL이 된다면 cycle이 존재하지 않는다는 의미이므로 while문을 종료하고 0을 반환한다.

 

[채점 결과]

 

 

 

 

 

'알고리즘' 카테고리의 다른 글

[HackerRank] Counting Sort 2  (0) 2021.09.29
[HackerRank] Compare the Triplets  (0) 2021.09.25
[HackerRank] Simple Array Sum  (0) 2021.09.18
[HackerRank] Sparse Arrays  (0) 2021.09.18
[HackerRank] Solve Me First  (0) 2021.09.11
복사했습니다!