문제를 이해하고 있다면 바로 풀이를 보면 됨
전체 코드로 바로 넘어가도 됨
마음대로 번역해서 오역이 있을 수 있음
연결 리스트의 머리 head가 주어졌을 때, 연결 리스트에 사이클이 존재하는지 판별해라.
연결 리스트에 어떤 노드에서 next 포인터를 계속 따라갔을 때 다시 도달하는 노드가 있다면, 연결 리스트에는 사이클이 존재한다. 내부적으로 pos는 꼬리의 next 포인터가 연결된 노드의 인덱스를 나타내는 데 사용한다.
연결 리스트에 사이클이 존재하면 true를 반환하고, 그렇지 않다면 false를 반환해라.
#1
Input: head = [3, 2, 0, -4], pos = 0
Output: true
Explanation: 연결 리스트에 사이클이 있고, 꼬리는 1번째 노드(0-index)에 연결되어 있다.
#2
Input: head = [1, 2], pos = 0
Output: true
Explanation: 연결 리스트에 사이클이 있고, 꼬리는 0번째 노드에 연결되어 있다.
#3
Input: head = [1], pos = 0
Output: false
Explanation: 연결 리스트에 사이클이 없다.
투 포인터를 활용해서 문제를 풀었다.
slow는 1칸씩 이동하고, fast는 2칸씩 이동하게 하여 사이클이 존재한다면 만날 것이고, 사이클이 존재하지 않으면 만나지 않는다.
/**
* Definition for singly-linked list.
* class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public boolean hasCycle(ListNode head) {
ListNode slow = head;
ListNode fast = head;
while(fast != null && fast.next != null){
slow = slow.next;
fast = fast.next.next;
if(slow == fast){
return true;
}
}
return false;
}
}