๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

์ฝ”ํ…Œ

[์ž๋ฃŒ๊ตฌ์กฐ] Linked list - 2

141. Linked List Cycle

๐Ÿค” ๋ฌธ์ œ ์ดํ•ด

์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๊ฐ€ ์ˆœํ™˜์ด ๋˜๋Š”์ง€ ํ™•์ธ ์žˆ์œผ๋ฉด true, ์•„๋‹ˆ๋ฉด false๋ฐ˜ํ™˜

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */

/**
 * @param {ListNode} head
 * @return {boolean}
 */
var hasCycle = function(head) {
  
};


๐Ÿค” EX

์ž…๋ ฅ: head = [3,2,0,-4], pos = 1 ์ถœ๋ ฅ: true
์ž…๋ ฅ: head = [1,2], pos = 0 ์ถœ๋ ฅ: true


๐Ÿค” ์˜์‚ฌ ์ฝ”๋“œ 

let slow = head ๋‘ ๊ฐœ์˜ ํฌ์ธํ„ฐ์ธ slow์™€ fast๋ฅผ ์ดˆ๊ธฐํ™”
let fast = head ๋‘˜ ๋‹ค ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ์˜ ์‹œ์ž‘์ ์ธ head๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.

while (fast != null && fast.next !== null)
{ fast ํฌ์ธํ„ฐ๊ฐ€ ๋์— ๋„๋‹ฌํ•˜์ง€ ์•Š์•˜๊ณ , ๋‹ค์Œ ๋…ธ๋“œ๋„ ์กด์žฌํ•˜๋Š” ๋™์•ˆ ๋ฐ˜๋ณต
์ด ์กฐ๊ฑด์€ fast ํฌ์ธํ„ฐ๊ฐ€ null,fast.next๊ฐ€ null์ด๋ฉด ๋ฐ˜๋ณต๋ฌธ์„ ์ข…๋ฃŒ

slow = slow.next; slow ํฌ์ธํ„ฐ๋ฅผ ํ•œ ์นธ์”ฉ ์ „์ง„์‹œํ‚ต๋‹ˆ๋‹ค.
fast = fast.next.next; fast ํฌ์ธํ„ฐ๋ฅผ ๋‘ ์นธ์”ฉ ์ „์ง„์‹œํ‚ต๋‹ˆ๋‹ค.

if (slow === fast) {: slow์™€ fast ํฌ์ธํ„ฐ๊ฐ€ ๋งŒ๋‚˜๋ฉด ์‚ฌ์ดํด์ด ์กด์žฌ true๋ฅผ ๋ฐ˜ํ™˜
return false;: ๋ฐ˜๋ณต๋ฌธ์„ ๋ชจ๋‘ ๋Œ์•˜์ง€๋งŒ ์‚ฌ์ดํด์ด ์—†๋Š” ๊ฒฝ์šฐ

์ฆ‰ slow์™€ fast ํฌ์ธํ„ฐ๊ฐ€ ๋งŒ๋‚˜์ง€ ์•Š์€ ๊ฒฝ์šฐ false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.


๐Ÿค” ํ•ด๊ฒฐํ•œ ์ฝ”๋“œ

var hasCycle = function(head) {
    let slow =head
    let fast = head
    while(fast!=null && fast.next!==null){
        slow= slow.next
        fast = fast.next.next

        if(slow ===fast){
            return true
        }
    }
    return false
};


๐Ÿค” Thinking

linked list ์ฝ”ํ…Œ ๋ฌธ์ œ์ค‘์—์„œ ์ œ์ผ ๊ธฐ๋ณธ์ด ๋˜๋Š” ๋ฌธ์ œ์ธ๊ฒƒ๊ฐ™์•˜๋‹ค.

๊ตฌ์กฐ์ ์œผ๋กœ๋Š” ์–ด๋ ต์ง€์•Š์•˜์ง€๋งŒ, ์ด๋ก ์œผ๋กœ๋Š” ๊ณต๋ถ€ํ•œ์  ์žˆ์ง€๋งŒ ์‹ค์ œ๋กœ linked list๋ฅผ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด์„œ ์ ‘ํ•ด๋ณธ๊ฑด ์ฒ˜์Œ์ด์˜€๊ธฐ์— ์ข€ ์–ด๋ ต๋‹ค๊ณ  ๋А๊ปด์กŒ๋‹ค. ์กฐ๊ธˆ๋” ๊ธฐ์ดˆ์ ์ธ ๊ด€๋ จ ๋ฌธ์ œ๋‚˜ ์ฝ”๋“œ๋“ค์„ ๋ณด๋ฉฐ ๊ณต๋ถ€ํ•ด์•ผ ๋ ๊ฒƒ๊ฐ™๋‹ค. ๋‹ค์Œ ๋ฌธ์ œ์—์„œ ์•„๋งˆ ํ•˜๊ณ ์žˆ์„๋“ฏ