https://leetcode.com/problems/linked-list-cycle
- 링크드 리스트의 다음 노드는 노드 별로 유일하게 가지고 있는 값이다.
➡️ 다음 노드는 일종의 pk이다.🧐 다음 노드로 노드들을 구분하자.
노드 = head 노드
while(노드 != null){
노드 = 노드.next
if(!set.add(노드)) return true
}
return false
public boolean hasCycle(ListNode head) {
ListNode s = head;
ListNode f = head;
while(f!=null && f.next!=null){
s = s.next;
f = f.next.next;
if(s==f){
return true;
}
}
return false;
}
거북이와 토끼 알고리즘을 이용해 링크드 리스트의 사이클을 확인할 수 있다.
거북이와 토끼 알고리즘
이 알고리즘에서는 거북이와 토끼라는 두 포인터가 데이터 구조를 순회한다. 거북이 포인터는 한 번에 한 단계씩 이동하고, 토끼 포인터는 거북이 포인터보다 두 배 빠르게 움직인다. 토끼 포인터는 거북이 포인터보다 두 배 빠른 속도로 움직이기 때문에 주기가 존재하면 특정 지점에서 거북이 포인터를 따라잡는다. 이 지점이 사이클의 교차점이다.
링크드 리스트와 거북이와 토끼 알고리즘이 밀접하게 연관된 만큼 꼭 기억해두자