๊ด€๋ฆฌ ๋ฉ”๋‰ด

Daehyunii's Dev-blog

13 ๋‹จ์ผ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ๋ณธ๋ฌธ

๐Ÿ“š Language & CS knowledge/Algorithm & Data structure

13 ๋‹จ์ผ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ

Daehyunii 2022. 8. 12. 23:54

13.1 ๋‹จ์ผ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ์†Œ๊ฐœ(Singly Linked Lists)

  ๋‹จ์ผ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋Š” ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜ ํ•œ ์ข…๋ฅ˜๋กœ ๋ฌธ์ž์—ด, ์ˆซ์ž ๋“ฑ ๋ฌด์—‡์ด๋“  ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ์ž๋ฃŒ ๊ตฌ์กฐ๋‹ค. ๋‹จ์ผ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋Š” ๋ฐ์ดํ„ฐ์™€ ๋ฐ์ดํ„ฐ์˜ ์—ฐ๊ฒฐ์ด ํ•œ ์ชฝ ๋ฐฉํ–ฅ์œผ๋กœ๋งŒ ์—ฐ๊ฒฐ๋˜๋Š” ์ž๋ฃŒ ๊ตฌ์กฐ๋‹ค. ๋ฐฐ์—ด์ฒ˜๋Ÿผ ์ˆœ์„œ์— ๋”ฐ๋ผ ๋‹ค์ˆ˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•œ๋‹ค. ํ•˜์ง€๋งŒ ๋ฐฐ์—ด๊ณผ์˜ ํฐ ์ฐจ์ด์ ์ด ์žˆ๋‹ค. ๋ฐฐ์—ด์˜ ๊ฒฝ์šฐ ๊ฐ ๋ฐ์ดํ„ฐ ์š”์†Œ๋“ค์€ ์œ„์น˜๊ฐ€ ์ง€์ •๋œ๋‹ค. ์ฆ‰, ๋ฐฐ์—ด์€ ์ธ๋ฑ์Šค๊ฐ€ ๋ถ€์—ฌ๋œ๋‹ค.  ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ ๋งˆ๋‹ค ๋ฐฐ์—ด์€ ๊ทธ ์œ„์น˜์— ๋”ฐ๋ฅธ ์ธ๋ฑ์Šค๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋ฐ˜๋ฉด ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋“ค์€ ๋‹ค์Œ ๋ฐ์ดํ„ฐ ์š”์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ธ๋ฑ์Šค ์—†์ด ๊ทธ๋ƒฅ ๋‹ค์ˆ˜์˜ ๋ฐ์ดํ„ฐ ์š”์†Œ๋“ค๋กœ ๊ตฌ์„ฑ๋˜๋ฉฐ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•  ์ธ๋ฐ์Šค๋Š” ์—†๋‹ค.

 

  ๋”ฐ๋ผ์„œ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋“ค์€ ๋‹ค์ˆ˜์˜ ๋…ธ๋“œ๋“ค๋กœ ๊ตฌ์„ฑ๋˜๊ณ  ๊ฐ ๋…ธ๋“œ๋Š” ๋ฌธ์ž์—ด ํ˜น์€ ์ˆซ์ž์™€ ๊ฐ™์€ ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•œ๋‹ค. ๊ฐ ๋…ธ๋“œ๋“ค์€ ๋‹ค์Œ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ •๋ณด ์—ญ์‹œ ์ €์žฅํ•˜๊ณ  ์žˆ์–ด์•ผ ํ•˜๋ฉฐ ๋” ์ด์ƒ ๋‹ค์Œ ๋…ธ๋“œ๊ฐ€ ์—†์„ ๊ฒฝ์šฐ null์„ ์ €์žฅํ•˜๊ฒŒ ๋œ๋‹ค. ์ค‘์š”ํ•œ ์ ์€ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋Š” ์ค‘๊ฐ„์— ์žˆ๋Š” ๋…ธ๋“œ๋“ค์„ ํ•˜๋‚˜ ํ•˜๋‚˜ ๋‹ค ์ถ”์ ํ•˜์ง€ ์•Š๋Š”๋‹ค. ํ—ค๋“œ ๋…ธ๋“œ๊ฐ€ ์–ด๋”” ์žˆ๋Š”์ง€๋งŒ ์•Œ๊ณ  ์žˆ์„ ๊ฒƒ์ด๋ฉฐ ํ—ค๋“œ ๋…ธ๋“œ๋ถ€ํ„ฐ ๋‹ค์Œ ๋‘ ๋ฒˆ์งธ ๋…ธ๋“œ๋ฅผ ์•Œ์•„๋‚ด๊ณ , ๋‘ ๋ฒˆ์งธ ๋…ธ๋“œ์—์„œ ์„ธ ๋ฒˆ์งธ ๋…ธ๋“œ๋ฅผ ์•Œ์•„ ๋‚ด๋Š” ๋ฐฉ์‹์œผ๋กœ ๋งˆ์ง€๋ง‰ ํ…Œ์ผ ๋…ธ๋“œ๊นŒ์ง€ ์ ‘๊ทผํ•˜๊ฒŒ ๋œ๋‹ค. ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ์šฉ์ดํ•˜๊ฒŒ ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋งˆ์ง€๋ง‰ ์„ธ ๋ฒˆ์งธ ํ”„๋กœํผํ‹ฐ๋กœ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜ '๊ธธ์ด'๋ฅผ ๊ณ„์† ์œ ์ง€ํ•˜์—ฌ ํ™œ์šฉํ•˜๋ฉด ์ข‹๋‹ค.

 

โ˜…๋‹จ์ผ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜ ํŠน์ง• ์ •๋ฆฌ

1.  ๋‹จ์ผ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋Š” ์ธ๋ฑ์Šค๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š๋‹ค. ๋Œ€์‹  ๋‹จ์ˆœํžˆ ์ฒซ ๋…ธ๋“œ์ž„์„ ์˜๋ฏธํ•˜๋Š” ํ—ค๋“œ ๋…ธ๋“œ์™€ ๋ ๋…ธ๋“œ์ž„์„ ์˜๋ฏธํ•˜๋Š” ํ…Œ์ผ ๋…ธ๋“œ๋ฅผ ๊ฐ€์งˆ ๋ฟ์ด๋‹ค.

2. ์›ํ•˜๋Š” ๋…ธ๋“œ๋ฅผ ์ฐพ์„๋•Œ, ์ƒˆ๋กœ์šด ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ๋Š” ํ—ค๋“œ ๋…ธ๋“œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ ํ•˜๋‚˜์”ฉ ๊ณ„์† ์ด๋™ํ•˜์—ฌ ๋…ธ๋“œ๋ฅผ ์ฐพ๊ฑฐ๋‚˜, ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๋œ๋‹ค.

3. ๊ฐ ๋…ธ๋“œ๋Š” next ํฌ์ธํ„ฐ(ํ”„๋กœํผํ‹ฐ)๋ฅผ ํ†ตํ•ด ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์œผ๋ฉฐ ์ด๋Š” ์ž„์˜ ์ ‘๊ทผ์ด ํ—ˆ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.(์›ํ•˜๋Š” ์ง€์  ๋ฐ”๋กœ ์ ‘๊ทผ ๋ถˆ๊ฐ€)

4. ์ƒˆ๋กœ์šด ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ๊ธฐ์กด ํ•ญ๋ชฉ์„ ์ œ๊ฑฐํ•  ๊ฒฝ์šฐ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋งค์šฐ ํšจ์œจ์ ์ž„(๋ฐฐ์—ด์˜ ๋งจ ๋’ค์˜ ์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•˜๊ฑฐ๋‚˜ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” ๋ฐฐ์—ด์€ ์ธ๋ฑ์Šค๊ฐ€ ๋‹ค ๋ณ€๊ฒฝ๋˜์–ด์•ผ ํ•˜์ง€๋งŒ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜ ๊ฒฝ์šฐ ์ธ๋ฑ์Šค๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ ‡๊ฒŒ ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.)

 

โ€ป์šฉ์–ด ์ •๋ฆฌ

1. ํ—ค๋“œ : ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜ ์‹œ์ž‘ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

2. ํ…Œ์ผ : ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

 

13.2 ๋‹จ์ผ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์™€ ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€, ์‚ญ์ œ ๋ฉ”์„œ๋“œ ๊ตฌํ˜„ํ•˜๊ธฐ

class Node{
    constructor(val){
        this.val = val; // ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅ
        this.next = null; // nextํ”„๋กœํผํ‹ฐ์— ๋‹ค์Œ ์ €์žฅํ•  ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๋ฆฌํ‚ด(๋‹จ์ผ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์ž„)
    }
}

class SinglyLinkedList{
    constructor(){
        this.head = null; //ํ—ค๋“œ ํฌ์ธํ„ฐ
        this.tail = null; //ํ…Œ์ผ ํฌ์ธํ„ฐ
        this.length = 0; // ์ด ๊ธธ์ด
    }
}

  ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ๋…ธ๋“œ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๊ณ , ๋‹จ์ผ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋Š” ํ—ค๋“œ, ํ…Œ์ผ, ๊ทธ๋ฆฌ๊ณ  ๋…ธ๋“œ์˜ ๊ธธ์ด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ํ”„๋กœํผํ‹ฐ๋ฅผ ๋งŒ๋“ค์–ด ์ค€๋‹ค. 

 

13.3 push ๋ฉ”์„œ๋“œ ๊ตฌํ˜„

  ๋‹จ์ผ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค๊ณ , ๋ฆฌ์ŠคํŠธ์— ์ถ”๊ฐ€ํ•  ๋…ธ๋“œ๋ฅผ ๋งŒ๋“ค์—ˆ์œผ๋‹ˆ ์ด์ œ push ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ ๋‹จ์ผ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์— ๋งจ ๋งˆ์ง€๋ง‰์— ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๋งŒ๋“  ๊ฒƒ์ด๋‹ค.(๋ฐฐ์—ด์˜ push ๋ฉ”์„œ๋“œ์™€ ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ํ•˜๊ฒŒ ๊ตฌํ˜„) ๋‹จ์ผ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜ ๋งˆ์ง€๋ง‰์— ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ํ…Œ์ผ์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฒƒ์„ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๋กœ ๋ฐ”๊ฟ”์ฃผ๊ณ  ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜ ๊ธธ์ด๋ฅผ ํ•˜๋‚˜ ๋Š˜๋ ค์ค˜์•ผ ํ•œ๋‹ค๋Š”๊ฒƒ์„ ์ฃผ์˜ํ•ด์•ผ ํ•จ

 

13.4 pop ๋ฉ”์„œ๋“œ ๊ตฌํ˜„

  push๋ฉ”์„œ๋“œ์™€ ๋Œ€์‘๋˜๋Š” ๋งจ ๋’ค์— ์œ„์น˜ํ•˜๋Š” ๋…ธ๋“œ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ธฐ๋Šฅ์„ ํ•˜๋Š” pop๋ฉ”์„œ๋“œ๋‹ค.(๋ฐฐ์—ด์˜ pop๋ฉ”์„œ๋“œ์™€ ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ํ•จ) push ๋ฉ”์„œ๋“œ์™€ ๋ฐ˜๋Œ€๋กœ ๊ธธ์ด๋ฅผ ํ•˜๋‚˜ ์ค„์—ฌ์ฃผ๊ณ , ํ…Œ์ผ์„ ์ œ๊ฑฐํ•œ ๋…ธ๋“œ์˜ ๋ฐ”๋กœ ์•ž ๋…ธ๋“œ๋กœ ์˜ฎ๊ฒจ์ค˜์•ผ ํ•จ. ์ค‘์š”ํ•œ ์ ์€ ๋‹จ์ผ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์ด๊ธฐ ๋•Œ๋ฌธ์— ํ—ค๋“œ์—์„œ ์ถœ๋ฐœํ•ด์„œ ๋งจ ๋์— ์žˆ๋Š” ๋…ธ๋“œ๋ฅผ ์ฐพ์•„์•ผ ํ•œ๋‹ค.

 

13.5 shift ๋ฉ”์„œ๋“œ ๊ตฌํ˜„

  ๋‹จ์ผ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜ ๊ฐ€์žฅ ์•ž์— ์žˆ๋Š” ๋…ธ๋“œ๋ฅผ ์‚ญ์ œํ•˜๋Š” ๊ธฐ๋Šฅ์„ ํ•œ๋‹ค. ๋ฆฌ์ŠคํŠธ ๋งจ ์•ž์— ๋ฌด์—‡์ด ์žˆ๋˜์ง€ shift ๋ฉ”์„œ๋“œ๋Š” ๊ทธ๊ฒƒ์„ ์ œ๊ฑฐํ•œ๋‹ค. ์ด๋Š” ํ˜„์žฌ ํ—ค๋“œ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” ๋…ธ๋“œ๋ฅผ ์ œ๊ฑฐํ•œ ํ›„ ํ—ค๋“œ๋ฅผ ์›๋ž˜ ํ—ค๋“œ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋˜ ๋ฆฌ์ŠคํŠธ์˜ ๋‘ ๋ฒˆ์งธ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

์ด๋ฑ์Šค ๋ชจ๋‘๋ฅผ ๋‹ค์‹œ ์ˆ˜์ •ํ•ด์•ผ ํ•˜๋Š” ๋ฐฐ์—ด๊ณผ ๋‹ค๋ฅด๊ฒŒ ๋ฆฌ์ŠคํŠธ ๊ธธ์ด์™€ ๊ด€๊ณ„์—†์ด ํ•ญ์ƒ ๋™์ผํ•œ ์‹œ๊ฐ„์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

13.6 unshift ๋ฉ”์„œ๋“œ ๊ตฌํ˜„

  ๋‹จ์ผ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜ ๊ฐ€์žฅ ์•ž์— ์ƒˆ๋กœ์šด ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ํ•œ๋‹ค. ์ฆ‰ ์ƒˆ๋กœ์šด ๋…ธ๋“œ๋ฅผ ๋งจ ์•ž์— ์ถ”๊ฐ€ํ•˜๊ณ  ํ—ค๋“œ๋ฅผ ์ƒˆ๋กœ ์ถ”๊ฐ€ํ•œ ๋…ธ๋“œ๋กœ ๋ฐ”๊ฟ”์ฃผ๋Š” ๊ฒƒ์ด๋‹ค. ๋งŒ์•ฝ ํ—ค๋“œ๊ฐ€ ์—†์„ ๊ฒฝ์šฐ์—๋Š” ํ—ค๋“œ์™€ ํ…Œ์ผ ๋ชจ๋‘ ์ƒˆ๋กœ์šด ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ์„ค์ •ํ•œ๋‹ค. 

 

13.7 get ๋ฉ”์„œ๋“œ ๊ตฌํ˜„

 get๋ฉ”์„œ๋“œ๋Š” ์œ„์น˜๋ฅผ ์˜๋ฏธํ•˜๋Š” ์ˆซ์ž๋ฅผ ์ธ์ˆ˜๋กœ ๋ฐ›์•„์„œ ์ฃผ์–ด์ง„ ์œ„์น˜์— ์žˆ๋Š” ๋…ธ๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด 0์„ ์ธ์ˆ˜๋กœ ์ฃผ๋ฉด ์ฒซ ๋ฒˆ์งธ ๋…ธ๋“œ์ธ ํ—ค๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋œ๋‹ค. ์ค‘์š”ํ•œ ์ ์€ ์ฃผ์–ด์ง„ ์ˆซ์ž ๋งŒํผ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋”ฐ๋ผ๊ฐ„ ํ›„ ํ•ด๋‹น ์œ„์น˜์˜ ๋…ธ๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๋”ฐ๋ผ์„œ ์ด๊ฒƒ์€ ๋ฐฐ์—ด๊ณผ ๋น„๊ตํ–ˆ์„๋•Œ ํšจ์œจ์ ์ธ ๋ฉ”์„œ๋“œ๋Š” ์•„๋‹ˆ๋‹ค. ์ธ๋ฑ์Šค๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ด๋™ํ•˜๋Š” ํšŸ์ˆ˜๋ฅผ ์ถ”์ ํ•˜๋Š” counter ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด ์ด๋™ํ•  ๋•Œ๋งˆ๋‹ค counter ๋ณ€์ˆ˜๋ฅผ ์ฆ๊ฐ€์‹œ์ผœ ์ถ”์ ํ•œ๋‹ค.

 

13.8 set ๋ฉ”์„œ๋“œ ๊ตฌํ˜„

  set ๋ฉ”์„œ๋“œ๋Š” ๋‘ ๊ฐœ์˜ ์ธ์ˆ˜๋ฅผ ์ „๋‹ฌ ๋ฐ›๋Š”๋‹ค. ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜๋Š” ์œ„์น˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ’, ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜๋Š” ํ•ด๋‹น ์œ„์น˜์˜ ๋…ธ๋“œ์˜ value๋ฅผ ๊ฐฑ์‹ ํ•  ๊ฐ’์„ ๋ฐ›์•„ ํ•ด๋‹น ์œ„์น˜์˜ ๋…ธ๋“œ์˜ value๋ฅผ ์ˆ˜์ •ํ•œ๋‹ค. ์ด ๊ณผ์ •์—์„œ ํ•ด๋‹น ์œ„์น˜์— ์žˆ๋Š” ๋…ธ๋“œ๋ฅผ ์ฐพ์•„๋‚ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— get ๋ฉ”์„œ๋“œ๋ฅผ ํ™œ์šฉํ•œ๋‹ค. 

 

13.9 insert ๋ฉ”์„œ๋“œ ๊ตฌํ˜„

  insert ๋ฉ”์„œ๋“œ๋Š” set ๋ฉ”์„œ๋“œ์™€ ๊ฐ™์ด ์ธ๋ฑ์Šค์™€ ๊ฐ’์„ ์ธ์ˆ˜๋กœ ๋ฐ›์•„๋“ค์ธ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ๋…ธ๋“œ๋ฅผ ๊ฐฑ์‹ ํ•˜๋Š” ๋Œ€์‹  ์ฃผ์–ด์ง„ ๋…ธ๋“œ๋ฅผ ๊ทธ๊ณณ์ด ์–ด๋””๋“  ์ฃผ์–ด์ง„ ์œ„์น˜์— ์ƒˆ๋กญ๊ฒŒ ์‚ฝ์ž…ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ธ์ˆ˜๋กœ ๋ฐ›์€ ์œ„์น˜์— ์žˆ๋Š” ๋…ธ๋“œ์™€ ์ธ์ˆ˜๋กœ ๋ฐ›์€ ์œ„์น˜์— ์žˆ๋Š” ๋…ธ๋“œ์˜ ์ „ ๋…ธ๋“œ ์‚ฌ์ด์— ์ƒˆ๋กœ์šด ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค. ์ด ๊ณผ์ •์—์„œ ํ•ด๋‹น ์œ„์น˜์— ์žˆ๋Š” ๋…ธ๋“œ๋ฅผ ์ฐพ์•„๋‚ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— get ๋ฉ”์„œ๋“œ๋ฅผ ํ™œ์šฉํ•œ๋‹ค. 

 

13.10 remove ๋ฉ”์„œ๋“œ ๊ตฌํ˜„

  remove ๋ฉ”์„œ๋“œ๋Š” ์œ„์น˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ’์„ ์ธ์ˆ˜๋กœ ๋ฐ›์•„์„œ ํ•ด๋‹น ์œ„์น˜์— ์žˆ๋Š” ๋…ธ๋“œ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ์ œ๊ฑฐ๋œ ๋…ธ๋“œ์˜ ์ „ ๋…ธ๋“œ์™€ ๋‹ค์Œ ๋…ธ๋“œ๋ฅผ ์—ฐ๊ฒฐ์‹œ์ผœ์ฃผ๋Š” ๊ธฐ๋Šฅ์„ ํ•œ๋‹ค. ๋งŒ์•ฝ ์ œ๊ฑฐ๋˜๋Š” ๋…ธ๋“œ๊ฐ€ ๋งจ ์•ž์— ์œ„์น˜ํ•œ ๋…ธ๋“œ์ธ ๊ฒฝ์šฐ์—๋Š” shift ๋ฉ”์„œ๋“œ๋ฅผ ํ™œ์šฉํ•˜๊ณ  ๋งจ ๋’ค์— ์œ„์น˜ํ•œ ๋…ธ๋“œ์ธ ๊ฒฝ์šฐ์—๋Š” pop ๋ฉ”์„œ๋“œ๋ฅผ ํ™œ์šฉํ•œ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ธ์ˆ˜๋กœ ๋ฐ›์€ ์œ„์น˜์˜ ๋…ธ๋“œ๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด get ๋ฉ”์„œ๋“œ๋ฅผ ํ™œ์šฉํ•œ๋‹ค.

 

13.11 reverse ๋ฉ”์„œ๋“œ ๊ตฌํ˜„

  reverse ๋ฉ”์„œ๋“œ๋Š” ๋…ธ๋“œ์˜ ์ˆœ์„œ๋ฅผ ๋’ค์ง‘๋Š” ๊ธฐ๋Šฅ์„ ํ•œ๋‹ค. ๋ฆฌ์ŠคํŠธ ๋‚ด์˜ ๋…ธ๋“œ์˜ ์œ„์น˜๋ฅด๋ฆฌ ์—ญ์œผ๋กœ ๋ฐ”๊ฟ”์ฃผ๋Š” ๊ฒƒ์ด๋‹ค. ํ—ค๋“œ๋ฅผ ํ…Œ์ผ๋กœ ๋งŒ๋“ค๊ณ , ๊ธฐ์กดํ—ค๋“œ์˜ next๊ฐ€ ๋ฐ˜๋Œ€๋กœ ์ƒˆ๋กœ์šด ํ…Œ์ผ์„ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ๋งŒ๋“ค์–ด ์ค€๋‹ค.

class Node{
    constructor(val){
        this.val = val;
        this.next = null;
    }
}

class SinglyLinkedList{
    constructor(){
        this.head = null;
        this.tail = null;
        this.length = 0;
    }
    push(val){
        var newNode = new Node(val);
        if(!this.head){//๋…ธ๋“œ ์—†์ด ๋น„์–ด์žˆ๋Š” ๊ฒฝ์šฐ์— ์‹คํ–‰ํ•  ์กฐ๊ฑด๋ฌธ์ž„
            this.head = newNode; // ํฌ์ธํ„ฐ ์—ญํ• 
            this.tail = this.head; // ํฌ์ธํ„ฐ ์—ญํ•  (๋น„์–ด ์žˆ๋Š” ๊ฒฝ์šฐ ํ—ค๋“œ์™€ ํ…Œ์ผ ๋ชจ๋‘๊ฐ€ ์ƒˆ๋กญ๊ฒŒ ์ƒ์„ฑ๋œ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ž„)
            //๋‹จ๋ฐฉํ–ฅ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ์ž๋ฃŒ๊ตฌ์กฐ(๊ฐ์ฒด)๋งŒ์˜ ํŠน๋ณ„ํ•œ ํŠน์ง•์ž„
        } else {
            this.tail.next = newNode;  //this.tail ์ž์ฒด๊ฐ€ ๋…ธ๋“œ์ž„;;์ด๊ฑด ๋…ธ๋“œ ์—ฐ๊ฒฐ์ž„//๊ทธ๋ž˜์„œ nextํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ–์„ ์ˆ˜์žˆ๋Š”๊ฑฐ์ž„
            this.tail = newNode; // ์—ฌ๊ธฐ์„œ๋Š” list ๊ฐ์ฒด์˜ ํ…Œ์ผ์ด ๋ญ”์ง€ ์•Œ๊ธฐ ์œ„ํ•ด ์ €์žฅ(๊ฐ์ฒด ์ž์ฒด๊ฐ€๊ฒƒ์„ ๊ฐ€๋ฆฌํ‚ด)
        }
        this.length++;
        return this;
    }



/*
๊ฐ์ฒด ์ƒ์„ฑ
๋…ธ๋“œ ์ƒ์„ฑ(ํ—ค๋“œ,<-ํ…Œ์ผ)   
    next : ๋…ธ๋“œ ์ƒ์„ฑ (<-ํ…Œ์ผ) 
               next : ๋…ธ๋“œ ์ƒ์„ฑ (<-ํ…Œ์ผ) 
                      next : ๋…ธ๋“œ ์ƒ์„ฑ (<-ํ…Œ์ผ) ํ…Œ์ผ์ด ๋งˆ์ง€๋ง‰์œผ๋กœ ์ €์žฅ๋œ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋ฏ€๋กœ tail.next์— ์ ‘๊ทผ ๊ฐ€๋Šฅ

์ฆ‰, ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋น„์–ด์žˆ๋Š” ํ•˜๋‚˜์˜ ํŠน๋ณ„ํ•œ ์ผ€์ด์Šค๊ฐ€ ์žˆ๊ณ (ํ—ค๋“œ์™€ ํ…Œ์ผ์ด ๊ฐ™์€ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ด)
๋น„์–ด ์žˆ์ง€ ์•Š์€ ๊ฒฝ์šฐ ํ˜„์žฌ์˜ ํ…Œ์ผ์„ ์ด์šฉํ•œ๋‹ค.(this.tail.next)

๋ฆฌ์ŠคํŠธ์˜ ํ”„๋กœํผํ‹ฐ์™€ ๋…ธ๋“œ์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ๊ตฌ๋ถ„ํ•ด์„œ ๋ณด๋ฉด ์ดํ•ด๊ฐ€ ์‰ฌ์›€
์ด ๋ฆฌ์ŠคํŠธ์—๋Š” ์ˆ˜ ๋ฐฑ๋งŒ์˜ ํ•ญ๋ชฉ๋“ค์ด ์ €์žฅ๋˜์–ด ์žˆ๋”๋ผ๋„ push()๋Š” ์•„์ฃผ ๋น ๋ฅด๊ฒŒ ๋™์ž‘ํ•œ๋‹ค.
๋‹จ์ง€ ํ…Œ์ผ์„ ์ด์šฉํ•ด ๋ฆฌ์ŠคํŠธ์˜ ๋งˆ์ง€๋ง‰์— ์ƒˆ๋กœ์šด ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ 
ํ…Œ์ผ์„ ๋งจ ๋์„ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ํ•œ ์ž๋ฆฌ ์›€์ง์—ฌ ์ฃผ๊ธฐ๋งŒ ํ•˜๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
*/

    pop(){
        if(!this.head) return undefined;
        var current = this.head;
        var newTail = current;
        while(current.next){
            newTail = current;
            current = current.next;
        }
        this.tail = newTail;
        this.tail.next = null;
        this.length--;
        if(this.length === 0){ // ๋ฆฌ์ŠคํŠธ์— ํ•˜๋‚˜์˜ ๋…ธ๋“œ๋งŒ ๋‚จ๊ฒจ์ ธ ์žˆ์„ ๊ฒฝ์šฐ๋Š” ํŠน๋ณ„ํ•œ ์ผ€์ด์Šค๊ฐ€ ๋˜์–ด null์„ ๋”ฐ๋กœ ์ถ”๊ฐ€ํ•ด์ค˜์•ผํ•จ
            this.head = null;
            this.tail = null;
        }
        return current;

    }
    
    shift(){// ๋ฆฌ์ŠคํŠธ ๊ฐ์ฒด์˜ ๊ฐ€์žฅ ์•ž์˜ ๋…ธ๋“œ๋ฅผ ์‚ญ์ œํ•˜๊ณ 
        if(!this.head) return undefined;
        var currentHead = this.head;
        this.head = currentHead.next;
        this.length--;
        if(this.length === 0){ // ๊ฐ’์ด ํ•˜๋‚˜์ธ ๊ฒฝ์šฐ ์ด๋Ÿฐ ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•˜๋Š”๋ฐ, ์ด๋ฏธ this.head.next๋Š” null ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฏ€๋กœ
            this.tail = null; //this.head๊นŒ์ง€ ๋‹ค์‹œ null ๊ฐ’์„ ํ• ๋‹นํ•ด ์ค„ ํ•„์š” ์—†์Œ
        }
        return currentHead;
    }
    
    unshift(val){
        var newNode = new Node(val);
        if(!this.head) {
            this.head = newNode;
            this.tail = this.head;
        } else {
            newNode.next = this.head;
            this.head = newNode;
        }
        this.length++;
        return this;
    }
    
    get(index){ // ์ฃผ์–ด์ง„ ์œ„์น˜์˜ ๋…ธ๋“œ๋ฅผ ๋ฐ˜ํ™˜
        if(index < 0 || index >= this.length) return null;
        var counter = 0;
        var current = this.head;
        while(counter !== index){
            current = current.next;
            counter++;
        }
        return current;
    }
    
    set(index, val){ // ์ธ์ˆ˜๋กœ ๋ฐ›์€ ์œ„์น˜๋ฅผ ์ธ์ˆ˜๋กœ ๋ฐ›์€ ๊ฐ’์œผ๋กœ ๊ฐฑ์‹ 
        var foundNode = this.get(index);
        if(foundNode){
            foundNode.val = val;
            return true;
        }
        return false;
    }
    
    insert(index, val){ // ์ธ์ˆ˜๋กœ ๋ฐ›์€ ์œ„์น˜์— ์ธ์ˆ˜๋กœ ๋ฐ›์€ ๊ฐ’์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์—ฐ๊ฒฐํ•˜๊ณ 
        if(index < 0 || index > this.length) return false;
        if(index === this.length) return !!this.push(val); //๋ช…์‹œ์  ํƒ€์ž… ๋ณ€ํ™˜
        if(index === 0) return !!this.unshift(val); // ๋ถ€์ • ๋…ผ๋ฆฌ ์—ฐ์‚ฐ์ž ๋‘ ๋ฒˆ ์‚ฌ์šฉ
        
        var newNode = new Node(val);
        var prev = this.get(index - 1);
        var temp = prev.next;
        prev.next = newNode;
        newNode.next = temp;
        this.length++;
        return true;
    }
    
 	remove(index){ // ์ธ์ˆ˜๋กœ ๋ฐ›์€ ์œ„์น˜์— ์žˆ๋Š” ๋…ธ๋“œ๋ฅผ ์‚ญ์ œํ•˜๊ณ 
        if(index < 0 || index >= this.length) return undefined;
        if(index === 0) return this.shift();
        if(index === this.length - 1) return this.pop();
        var previousNode = this.get(index - 1);
        var removed = previousNode.next;
        previousNode.next = removed.next;
        this.length--;
        return removed;
    }
    
 	reverse(){
        var current = this.head;
        this.head = this.tail;
        this.tail = current;
        var next;
        var prev = null;
        for(var i = 0; i < this.length; i++){
            next = current.next; // ํ˜„์žฌ ๋…ธ๋“œ์˜ next ํ”„๋กœํผํ‹ฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ’์„ next ๋ณ€์ˆ˜์— ๋‹ด๊ณ  
            current.next = prev; // ํ˜„์žฌ ๋…ธ๋“œ์˜ ๋„ฅ์ŠคํŠธ ํ”„๋กœํผํ‹ฐ๊ฐ€ prev ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ํ•˜๋Š”๊ฒƒ
            //node.next๋กœ ๋จผ์ € next๋ณ€์ˆ˜์— ๊ฐ’์„ ์ค˜์„œ ์ •๋ณด๋ฅผ ์ €์žฅํ•ด๋†“๊ณ , ๊ทธ ๋‹ค์Œ์— ์ด์ œ node.next์˜ ๊ฐ’์„ prev๋ณ€์ˆ˜๋กœ  ๋ณ€๊ฒฝํ•˜๋Š”๊ฒƒ์ž„!!
            //ํ•œ๋งˆ๋””๋กœ next ๋ณ€์ˆ˜๋Š” ๊ธธ์žก์ด ์—ญํ•  node๊ฐ€ ๊ฐˆ ๊ธธ์„ ๋ฏธ๋ฆฌ ๊ธธํ„ฐ๋†“๊ณ , node ๋ณ€์ˆ˜๊ฐ€ ํŽธํ•˜๊ฒŒ 
            //node๋ณ€์ˆ˜์˜ ๋…ธ๋“œ์˜ next ํ”„๋กœํผํ‹ฐ๋ฅผ ํŽธํ•˜๊ฒŒ prev๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋งŒ๋“ค์–ด ์คŒ
            prev = current;
            current = next; //์—ฌ๊ธฐ๊นŒ์ง€ ๋ณด๋ฉด current์™€ next ๋ณ€์ˆ˜์— ๋“ค์–ด์žˆ๋Š” ๋…ธ๋“œ๊ฐ€ ๊ฐ™์ด ์žˆ์Œ
            //๊ทธ๋Ÿฌ๋‹ค๊ฐ€ ๊ทธ ๋‹ค์Œ ๋ฐ˜๋ณต๋ฌธ๋•Œ next๊ฐ€ ๋‹ค์Œ ๋…ธ๋“œ๋กœ ๋„˜์–ด๊ฐ€๊ฒŒ๋จ
    }
    return this;
}

 

 

 

'๐Ÿ“š Language & CS knowledge > Algorithm & Data structure' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

15 ์Šคํƒ & ํ  (0) 2022.08.14
14 ์ด์ค‘ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ  (0) 2022.08.13
11 ํ€ต ์ •๋ ฌ  (0) 2022.08.08
10 ํ•ฉ๋ณ‘ ์ •๋ ฌ  (0) 2022.08.07
09 ์‚ฝ์ž… ์ •๋ ฌ  (0) 2022.08.07