LinkedList์ ์ํ์ด ์๋์ง ํ์ธํ๋ ๊ฐ์ฅ ๋ํ์ ์ธ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ํ๋ก์ด๋์ ์ฌ์ดํด ๊ฒ์ถ ์๊ณ ๋ฆฌ์ฆ(Floyd's Cycle Detection Algorithm) ์ด ์๋ค.
์ด ์๊ณ ๋ฆฌ์ฆ์ ํํ ํ ๋ผ์ ๊ฑฐ๋ถ์ด ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๋ถ๋ฆฐ๋ค.
ํ ๋ผ์ ๊ฑฐ๋ถ์ด ์๊ณ ๋ฆฌ์ฆ
1. ๋น ๋ฅธ(hare) ํฌ์ธํฐ์ ๋๋ฆฐ(tortoise)ํฌ์ธํฐ, ๋ ๊ฐ์ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ๋ค.
2. ๋น ๋ฅธ ํฌ์ธํฐ๋ ํ ๋ฒ์ ๋ ๊ฐ์ ๋ ธ๋๋ฅผ ๊ฑด๋๋ฐ๊ณ ๋๋ฆฐ ํฌ์ธํฐ๋ ํ ๋ฒ์ ํ ๊ฐ์ ๋ ธ๋๋ฅผ ๊ฑด๋๋ฐ๋ ๋ฐฉ์์ผ๋ก ์์ง์ธ๋ค.
3. ์ฐ๊ฒฐ๋ฆฌ์คํธ์ ์ฌ์ดํด์ด ์๋ค๋ฉด, ๋น ๋ฅธ ํฌ์ธํฐ๋ ๋จผ์ ๋(null)์ ๋์ฐฉํ๊ฒ ๋๋ค.
4. ๋ง์ฝ ์ฌ์ดํด์ด ์๋ค๋ฉด, ๋น ๋ฅธ ํฌ์ธํฐ์ ๋๋ฆฐ ํฌ์ธํฐ๋ ์ธ์ ๊ฐ ๋ง๋๊ฒ ๋๋ค.
๊ตฌํ
public Boolean hasCycle() {
Node<E> slow = this.head;
Node<E> fast = this.head;
while (fast != null && fast.next != null) {
slow = slow.next; // ํ ์นธ์ฉ ์ ํ
fast = fast.next.next; // ๋ ์นธ์ฉ ์ ํ
if (slow == fast) {
return true; // ์ธ์ ๊ฐ ๋ง๋๋ค๋ฉด ์ฌ์ดํด ์๋ ๊ฒ
}
}
return false;
}