๐ค ๋ฌธ์ ์ดํด
์ฐ๊ฒฐ๋ฆฌ์คํธ๊ฐ ์ํ์ด ๋๋์ง ํ์ธ ์์ผ๋ฉด 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
๐ค ์์ฌ ์ฝ๋
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๋ฅผ ์ฝ๋๋ฅผ ํตํด์ ์ ํด๋ณธ๊ฑด ์ฒ์์ด์๊ธฐ์ ์ข ์ด๋ ต๋ค๊ณ ๋๊ปด์ก๋ค. ์กฐ๊ธ๋ ๊ธฐ์ด์ ์ธ ๊ด๋ จ ๋ฌธ์ ๋ ์ฝ๋๋ค์ ๋ณด๋ฉฐ ๊ณต๋ถํด์ผ ๋ ๊ฒ๊ฐ๋ค. ๋ค์ ๋ฌธ์ ์์ ์๋ง ํ๊ณ ์์๋ฏ