๐Ÿ’ป Knowledge/์ž๋ฃŒ๊ตฌ์กฐ

LinkedList๊ฐ€ ์ˆœํ™˜(cycle)์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€ ์–ด๋–ป๊ฒŒ ํ™•์ธํ• ๊นŒ? ๐Ÿ‡๐Ÿ’จ ๐Ÿข

ming412 2023. 9. 25. 13:54

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;
}