[JavaScript] ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ Linked List in JS
728x90

Today, What I learned?

์–ด์ œ์— ์ด์–ด์„œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ณต๋ถ€๋ฅผ ๊ณ„์†!...

์ž๋ฃŒ๊ตฌ์กฐ ์ค‘ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด๋ณด๊ณ  ๊ตฌํ˜„ํ•ด๋ณด๋Š” ์‹œ๊ฐ„์„ ๊ฐ€์กŒ๋‹ค.

ํŠœํ„ฐ๋‹˜์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ์ž๋ฃŒ๊ตฌ์กฐ์— ๋Œ€ํ•œ ์ฝ”๋ฉ˜ํŠธ์™€ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด๋ณด๋ ค ํ•œ๋‹ค. ๐Ÿ™Œ

 

์‹œ๊ฐ„ ๋ณต์žก๋„์™€ ๊ณต๊ฐ„ ๋ณต์žก๋„

์‹œ๊ฐ„ ๋ณต์žก๋„์™€ ๊ด€๋ จํ•ด์„œ๋Š” ์˜ˆ์ „์— ๋ธ”๋กœ๊น…์„ ํ•œ ์ ์ด ์žˆ๋‹ค.

https://i-ten.tistory.com/154

 

์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์‹œ๊ฐ„๋ณต์žก๋„์™€ Big-O

๋“ค์–ด๊ฐ€๋ฉฐ ๊ธฐ์™•์ด๋ฉด ๊ฐ€์žฅ ๋น ๋ฅธ ๊ธธ๋กœ ๊ฐ€์ž! ์ถœํ‡ด๊ทผ์„ ํ•˜๊ฑฐ๋‚˜, ์นœ๊ตฌ์™€์˜ ์•ฝ์† ๋“ฑ๋“ฑ. ์–ด๋”˜๊ฐ€๋ฅผ ํ–ฅํ•  ๋•Œ ์šฐ๋ฆฌ๋Š” ํ•ญ์ƒ ๋ชฉ์ ์ง€๋กœ ๊ฐ€๋Š” ๋น ๋ฅธ ๋ฃจํŠธ๋ฅผ ์ฐพ์•„๋ณด๋Š” ๊ฒฝํ–ฅ์ด ์žˆ๋‹ค. ์ปดํ“จํ„ฐ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋‹ค. ํ”„๋กœ๊ทธ

i-ten.tistory.com

 

์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ๋Š” ์ด์ œ ๊ณต๊ฐ„๋ณต์žก๋„๋ณด๋‹ค ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๋” ํ•„์ˆ˜์ ์œผ๋กœ ์ฑ™๊ฒจ์•ผ ํ•˜๋Š”๋ฐ,

๊ณต๊ฐ„ ๋ณต์žก๋„๋Š” ๋ฐ์ดํ„ฐ์˜ ํฌ๊ธฐ๊ฐ€ ํ›จ์”ฌ ์ค‘์š”ํ•ด์„œ, ๋ฆฌ์†Œ์Šค๋ฅผ ์–ผ๋งˆ๋‚˜ ์žก์•„๋จน๋Š๋ƒ? ์˜ ๋ฌธ์ œ๋‹ค.

๋ฌผ๋ก  ๊ณต๊ฐ„ ๋ณต์žก๋„๋„ ๋‚ฎ์„์ˆ˜๋ก ์ข‹๋‹ค!

 

 

์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์–ด๋–ค ๊ฒƒ์„ ๊ธฐ์ค€์œผ๋กœ ์„ ํƒํ•ด์•ผ ํ• ๊นŒ?

์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์„ ํƒํ•  ๋•Œ ๊ณ ๋ คํ•ด์•ผ ํ•  ์š”์†Œ๋Š” ๋„ค ๊ฐ€์ง€ ์ •๋„๊ฐ€ ์žˆ๋‹ค.

1. ์‚ฝ์ž… ์‹œ๊ฐ„

2. ์‚ญ์ œ ์‹œ๊ฐ„

3. ๊ฒ€์ƒ‰์‹œ๊ฐ„

4. ์ •๋ ฌ ์—ฌ๋ถ€

 

์ž๋ฃŒ๊ตฌ์กฐ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์—, ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋”ฐ์ ธ์„œ ์ ์ ˆํ•œ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ์ด๋‹ค! ๐Ÿ‘

 

 

์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ Linked List

์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋Š” O(N)์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ , ๋ฐฐ์—ด(Array)๊ณผ ํ•จ๊ป˜ ๋น„๊ต๊ฐ€ ๋งŽ์ด ๋œ๋‹ค.

ํฌ๊ธฐ๊ฐ€ ๊ณ ์ •์ด ๋˜์–ด์žˆ๋Š” ๋ฐฐ์—ด๊ณผ ๋‹ค๋ฅด๊ฒŒ ์•ž ๋’ค์˜ ํฌ์ธํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•ด์„œ ์›์†Œ๋ฅผ ์œ ์—ฐํ•˜๊ฒŒ ์‚ฝ์ž…/์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ •๋ฆฌํ•ด๋ณด๋ฉด ์ด๋ ‡๋‹ค.

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

๋”ฐ๋ผ์„œ ๋ฐ์ดํ„ฐ์˜ ์‚ฝ์ž…๊ณผ ์‚ญ์ œ๊ฐ€ ๋งŽ์€ ๊ฒฝ์šฐ๋ผ๋ฉด ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ์“ฐ๋Š” ๊ฒƒ์ด ์ข‹์œผ๋ฉฐ, ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์€ ๊ฒฝ์šฐ๋ผ๋ฉด ๋ฐฐ์—ด์„ ์“ฐ๋Š” ๊ฒƒ์ด ๋” ์ ํ•ฉํ•˜๋‹ค.

 

 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ๊ตฌํ˜„ํ•˜๊ธฐ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์™€ ๋ช‡ ๊ฐ€์ง€ ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•ด๋ณด์•˜๋‹ค.
๊ตฌํ˜„ํ•œ ๊ฒƒ์€ ๋‹จ๋ฐฉํ–ฅ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ!

 

Node

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

์šฐ์„  ๋…ธ๋“œ ํด๋ž˜์Šค.
์ดˆ๊ธฐ๊ฐ’์œผ๋กœ ๋‹ค์Œ ๋…ธ๋“œ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— null ๊ฐ’์„ ๋„ฃ๋Š”๋‹ค.

 

Linked List

class LinkedList {
  constructor() {
    this.head = null;
    this.tail = null;
    this.size = 0;
  }
}

์ดˆ๊ธฐ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ํด๋ž˜์Šค.
๋งจ ์•ž, ๋งจ ๋’ค๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” head์™€ tail. ๊ธธ์ด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” size ๋ชจ๋‘ ์ดˆ๊ธฐ๊ฐ’์ด๋‹ค.

 

append()

  append(data) {
    let node = new Node(data);
    this.tail.next = node; // ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ์— ์ƒˆ๋กœ์šด ๋…ธ๋“œ ์ถ”๊ฐ€!
    this.tail = node; // ์ „์ฒด ๋ฆฌ์ŠคํŠธ์˜ ๋งˆ์ง€๋ง‰ ์„ค์ •
    this.size += 1;
  }

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

 

toString()

toString() {
    for (let node = this.head; node != null; node = node.next) {
      console.log(`${node.data} -> `);
    }
  }

๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ์ถœ๋ ฅํ•˜๊ธฐ ์œ„ํ•œ toString ํ•จ์ˆ˜.
์ถœ๋ ฅ์„ ์œ„ํ•œ ๋ฐฉ๋ฒ•์€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€์ง€๋งŒ, ๋‚˜๋Š” for๋ฌธ์„ ํ†ตํ•ด ๋…ธ๋“œ๋ฅผ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๊นŒ์ง€ ์ด๋™ํ•ด๊ฐ€๋ฉฐ ์ถœ๋ ฅํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ ํƒํ–ˆ๋‹ค.

 

insert()

insert(position = 0, data) {
    if (position < 0 || position > this.size) {
      return false;
    }

    let node = new Node(data);
    let curr = this.head;
    let prev,
      index = 0;

    if (position === 0) {
      node.next = curr;
      this.head = node;
    } else {
      while (index++ < position) {
        prev = curr;
        curr = curr.next;
      }
    }

    node.next = curr; // ์ƒˆ๋กœ์šด ๋…ธ๋“œ์— next๋ฅผ ๋‹ค์Œ ๋…ธ๋“œ๋กœ ์ง€์ • (์ค‘๊ฐ„์— ๋ผ์–ด๋“  ์ƒํƒœ)
    prev.next = node; // ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ ์ƒˆ๋กœ์šด ๋…ธ๋“œ์— ๊ฐ€๋ฆฌ์ผœ์„œ ์ค‘๊ฐ„์— ๋ผ์–ด๋“  ๊ฒƒ ๋งˆ๋ฌด๋ฆฌ

    this.size++;

    return true;
  }

์›ํ•˜๋Š” ์œ„์น˜์— ๊ฐ’์„ ์ถ”๊ฐ€ํ•˜๋Š” insert ํ•จ์ˆ˜.

insert ๋˜๋Š” ๊ณผ์ •์„ ์ดํ•ดํ•˜๋Š”๋ฐ ์‹œ๊ฐ„์ด ์ข€ ๊ฑธ๋ ธ๋‹ค. ๐Ÿ˜‡

๋จผ์ € ํ•ด๋‹น ์œ„์น˜๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ ๊ฐ’์ด ์•„๋‹ ๊ฒฝ์šฐ์— ๋Œ€ํ•œ ์—๋Ÿฌ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ์—ˆ๋‹ค.

 

์›ํ•˜๋Š” ์œ„์น˜๊ฐ€ 0์ผ ๊ฒฝ์šฐ์—๋Š” ๋ฐ”๋กœ ์ƒˆ๋กœ์šด ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ–ˆ๊ณ ,
์•„๋‹Œ ๊ฒฝ์šฐ์—๋Š” ํ•ด๋‹น ์œ„์น˜๊นŒ์ง€ ์ด๋™์„ ํ•˜๋Š”๋ฐ ์ด๋•Œ prev ๋ผ๋Š” ๋ณ€์ˆ˜์— ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ ๋‹ด์•„๊ฐ€๋ฉฐ ์ด๋™ํ•œ๋‹ค.

์›ํ•˜๋Š” ์œ„์น˜์— ๋„์ฐฉํ–ˆ์„ ๋•Œ, ์ƒˆ๋กœ์šด ๋…ธ๋“œ์˜ ํฌ์ธํ„ฐ๋ฅผ ๋ผ์–ด๋“ค ์œ„์น˜์˜ ๋‹ค์Œ ๋…ธ๋“œ๋ฅผ ํ–ฅํ•˜๊ฒŒ ํ•œ๋‹ค.

์ƒˆ๋กœ ๋ผ์–ด๋“œ๋Š” 62๋ฒˆ์˜ ํฌ์ธํ„ฐ๊ฐ€ 6์„ ํ–ฅํ•˜๋Š” ์ค‘!

๊ทธ๋ฆฌ๊ณ  ๊ธฐ์กด ๋…ธ๋“œ์˜ ํฌ์ธํ„ฐ๊ฐ€ ์ƒˆ๋กœ์šด ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ํ•œ๋‹ค.

๊ธฐ์กด ๋…ธ๋“œ 77์ด ์ƒˆ๋กœ์šด ๋…ธ๋“œ 62๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค
์ถ”๊ฐ€ ์™„!

๊ทธ๋Ÿผ ์ถ”๊ฐ€ ์™„.

 

removeAt()

removeAt(position = 0) {
    if (position < 0 || position >= this.size) {
      return false;
    }

    let current = this.head;
    let index = 0;
    let prev;

    if (position === 0) {
      this.head = current.next;
    } else {
      while (index++ < position) {
        prev = current;
        current = current.next;
      }

      prev.next = current.next; // ์ด์ „ ๋…ธ๋“œ๊ฐ€ ๋‹ค์Œ ๋…ธ๋“œ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ํ•จ
    }
    this.length--;
  }

์›ํ•˜๋Š” ์œ„์น˜์˜ ๋…ธ๋“œ๋ฅผ ์‚ญ์ œํ•˜๋Š” removeAt ํ•จ์ˆ˜.
์œ„์น˜์— ๋Œ€ํ•œ ์—๋Ÿฌ ์ฒ˜๋ฆฌ์™€ ํ•ด๋‹น ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ•˜๋Š” ๊ณผ์ •์€ ์œ„์™€ ๋™์ผํ•˜๋‹ค.

๋‹ค๋งŒ ์‚ญ์ œํ•  ๋•Œ๋Š” ์‚ญ์ œํ•˜๋ ค๋Š” ๋…ธ๋“œ๋ฅผ current๋ผ๊ณ  ํ–ˆ์„ ๋•Œ,
์ด์ „ ๋…ธ๋“œ์˜ ํฌ์ธํ„ฐ๊ฐ€ current์˜ ๋‹ค์Œ ๋…ธ๋“œ๋ฅผ ํ–ฅํ•˜๋„๋ก ํ•œ๋‹ค.

 

์‚ญ์ œ๋˜๋Š” ์ค‘์ธ 62

๋” ์ด์ƒ head๋กœ๋ถ€ํ„ฐ ํƒ์ƒ‰์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋œ 62๋Š” ์ž์—ฐ์Šค๋ ˆ ์‚ญ์ œ!.. 

์‚ญ์ œ ์™„.

 

 

์ด์ œ ์ด๊ฑธ ๊ธฐ๋ฐ˜์œผ๋กœ ์—ฌ๋Ÿฌ ํ•จ์ˆ˜๋ฅผ ์งœ ๋ณผ ์ˆ˜ ์žˆ๊ฒ ์ง€๋งŒ ์˜ค๋Š˜์€ ์ด๋งŒํผ ์ดํ•ดํ•˜๊ธฐ๋„ ๋ฒ…์ฐจ๋‹ค ๋ฒ…์ฐจ ๐Ÿ˜‡...

์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ๋ฌธ์ œ๋ฅผ ์กฐ๊ธˆ์ด๋‚˜๋งˆ ๊ฑด๋“œ๋ ค๋ณผ ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ํฌ๋งํ•˜๋ฉฐ ์˜ค๋Š˜ TIL์„ ๋งˆ์นœ๋‹ค!.. ๐Ÿ‘

 

 

 

 

 

 

728x90