TIL

23/10/17 TIL __ ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ

GABOJOK 2023. 10. 17. 17:14

 
 

๐Ÿš—  ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ

 

  • ์œ ๋™์ ์œผ๋กœ ์—ฐ๊ฒฐ๊ณ ๋ฆฌ๋ฅผ ๋–ผ์—ˆ๋‹ค๊ฐ€ ๋ถ™์˜€๋‹ค๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ
  • ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ ์š”์†Œ์˜ ์‚ฝ์ž…/์‚ญ์ œ์— ๊ฐ•์ ์ด ์žˆ๋‹ค. 
  • ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…/์‚ญ์ œ ํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•˜๋ฉด ์ข‹๋‹ค. 

 
 
 
 

๐Ÿง  ๋ฐฐ์—ด   vs   ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ

  • ์ด์™€ ๋ฐ˜๋Œ€๋กœ ๋ฐฐ์—ด์˜ ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…/์‚ญ์ œ ๊ณผ์ •์ด ๋ฒˆ๊ฑฐ๋กญ๋‹ค. ์š”์†Œ ๋ณ€๊ฒฝ ํ›„, ์žฌ์ •๋ ฌ์ด ์ด๋ฃจ์–ด ์ง„๋‹ค. 
  • ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ ‘๊ทผ ํ•˜๋Š” ๊ฒฝ์šฐ ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ์ธ๋ฑ์Šค ๊ฐ’์— ๋”ฐ๋ผ ํ•œ๋ฒˆ์— ๊ฐ’์„ ์ฐพ๊ธฐ ๋•Œ๋ฌธ.

 
 
 
 
 
์˜ˆ์‹œ) __ ๊ฐ ๋…ธ๋“œ๋“ค์„ ์—ฐ๊ฒฐํ•˜๊ธฐ

class Node {
  constructor(data) {
    this.data = data;

    //ํฌ์ธํ„ฐ๋กœ ์‚ฌ์šฉํ•  ๊ฐ’์ด ํ•„์š”ํ•ด์„œ ๋งŒ๋“ฌ.
    this.next = null;
  }
}

class LinkedList {
  constructor(value) {
    //ํ—ค๋“œ๋กœ ์‹œ์ž‘ํ•  ๊ฐ’์„ ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ฌ.
    this.head = new Node(value);
    this.nodeCount = 0;
  }

  //๋…ธ๋“œ๋ฅผ ๋ถ™์—ฌ์ฃผ๋ฉด์„œ ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ฌ.
  append(value) {
    let curr = this.head;

    //curr.next๊ฐ€ null์ธ ๊ฒฝ์šฐ๋ฅผ ๊ณ„์† ํ•˜๋‚˜ํ•˜๋‚˜ ๋ณด๋ฉด์„œ ์ฐพ๋Š”๊ฑฐ์ž„.
    while (curr.next !== null) {
      curr = curr.next;
    }
    
    //newNode ๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ณ , ๊ฑฐ๊ธฐ์— ์ƒˆ๋กœ ๋งŒ๋“  node๋ฅผ ์ง‘์–ด๋„ฃ์Œ.
    const newNode = new Node(value);
    //ํ—ค๋“œ ๋…ธ๋“œ์˜ next ๊ฐ’์œผ๋กœ ๋ฐฉ๊ธˆ ๋งŒ๋“  newNode ๋„ฃ์–ด์คŒ.
    curr.next = newNode;
    // ๋งํฌ๋“œ๋ฆฌ์ŠคํŠธ ๋ช‡๊ฐœ์ •๋„ ๋…ธ๋“œ๊ฐ€ ์žˆ๋Š”์ง€ ์…ˆ. _ get, add ํ• ๋•Œ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ์— ์šฉ์ด
    this.nodeCount++;
  }
}

 
์œ„ ์˜ˆ์‹œ์—์„œ, while ๋ฌธ ๋ถ€๋ถ„์ด ์ •๋ง ์ดํ•ด๊ฐ€ ์•ˆ๊ฐ”์—ˆ๋‹ค. 
๋ถ„๋ช… next๋Š” null์ด๋žฌ๋Š”๋ฐ, ์™œ null์ด ์•„๋‹Œ ๊ฒฝ์šฐ๊ฐ€ ๋‚˜์˜ฌ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•˜๋Š” ๊ฑด์ง€ ๋ชจ๋ฅด๊ฒ ์—ˆ๋‹ค. 
 
 
 
๋‹ต์€ ๋ฐ”๋กœ ์•„๋ž˜์— ์žˆ์—ˆ๋‹ค. 
 

๋”๋ณด๊ธฐ

๋ฐ”๋กœ ์•„๋ž˜์—์„œ ๊ธฐ์กด์— ์žˆ๋˜ ๋…ธ๋“œ์— ์ƒˆ๋กœ์šด ๋…ธ๋“œ๋ฅผ ๋ถ™์—ฌ์ค„ ๋•Œ์—, 
.next๊ฐ’์œผ๋กœ ๋‹ค์Œ ๋…ธ๋“œ๋ฅผ ์ง€์ •ํ•ด ์ค€๋‹ค.  __์ด๋ ‡๊ฒŒ __>>>  curr.next = newNode;
์ด while ๋ฌธ์—์„œ๋Š”, null์ธ ๊ฒฝ์šฐ๋งŒ์„ ์ฐพ๊ธฐ ๋•Œ๋ฌธ์—, 
์ง€๊ธˆ ์ด ๋ฐ˜๋ณต๋ฌธ ์•ˆ์—๋Š” ์ด๋ฏธ .next์— ๊ทธ๋‹ค์Œ ๋…ธ๋“œ๊ฐ€ ๋“ค์–ด๊ฐ€ ์žˆ๋‹ค.

 
 
 
 
๋งํฌ๋“œ๋ฆฌ์ŠคํŠธ ์—์„œ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๊ณ , ์ถ”๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„๊นŒ์ง€ ์•„๋ž˜ ์˜ˆ์‹œ์— ๋‚˜์™€์žˆ๋‹ค

์ „์ฒด ์˜ˆ์‹œ)
 

class Node {
  constructor(data) {
    this.data = data;

    //ํฌ์ธํ„ฐ๋กœ ์‚ฌ์šฉํ•  ๊ฐ’์ด ํ•„์š”ํ•ด์„œ ๋งŒ๋“ฌ.
    this.next = null;
  }
}

class LinkedList {
  constructor(value) {
    //ํ—ค๋“œ๋กœ ์‹œ์ž‘ํ•  ๊ฐ’์„ ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ฌ.
    this.head = new Node(value);
    this.nodeCount = 0;
  }

  //๋…ธ๋“œ๋ฅผ ๋ถ™์—ฌ์ฃผ๋ฉด์„œ ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ฌ.
  append(value) {
    let curr = this.head;

    //curr.next๊ฐ€ null์ธ ๊ฒฝ์šฐ๋ฅผ ๊ณ„์† ํ•˜๋‚˜ํ•˜๋‚˜ ๋ณด๋ฉด์„œ ์ฐพ๋Š”๊ฑฐ์ž„.
    while (curr.next !== null) {
      curr = curr.next;
    }
    //newNode ๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ณ , ๊ฑฐ๊ธฐ์— ์ƒˆ๋กœ ๋งŒ๋“  node๋ฅผ ์ง‘์–ด๋„ฃ์Œ.
    const newNode = new Node(value);
    
    //ํ—ค๋“œ ๋…ธ๋“œ์˜ next ๊ฐ’์œผ๋กœ ๋ฐฉ๊ธˆ ๋งŒ๋“  newNode ๋„ฃ์–ด์คŒ.
    curr.next = newNode;
    
    // ๋งํฌ๋“œ๋ฆฌ์ŠคํŠธ ๋ช‡๊ฐœ์ •๋„ ๋…ธ๋“œ๊ฐ€ ์žˆ๋Š”์ง€ ์…ˆ. _ get, add ํ• ๋•Œ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ์— ์šฉ์ด
    this.nodeCount++;
  }


  //๋งํฌ๋“œ๋ฆฌ์ŠคํŠธ ์—์„œ ์›ํ•˜๋Š” ์š”์†Œ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฉ”์†Œ๋“œ
  getNode(index) {
    //ํ•ด๋‹น ์ธ๋ฑ์Šค๊ฐ€ ์œ ํšจํ•œ ๊ฐ’์ธ์ง€ nodeCount ์˜ ๊ฐ’์ด๋ž‘ ๋น„๊ตํ•ด์•ผํ•จ.
    if (index > nodeCount) {
      console.log("linkedList ์˜ ํฌ๊ธฐ๋ณด๋‹ค ๋ฒ—์–ด๋‚œ ๊ฐ’ ์ž…๋‹ˆ๋‹ค.");
    } else {
      //index๊ฐ€ ์œ ํšจํ•œ ๊ฐ’์ธ ๊ฒฝ์šฐ ์•„๋ž˜ ์‹คํ–‰.

      //node์— ๋งํฌ๋“œ๋ฆฌ์ŠคํŠธ์˜ ์‹œ์ž‘ ๋…ธ๋“œ๋ฅผ ๋„ฃ์–ด์ฃผ๊ณ ,
      let node = this.head;
      
      //์›ํ•˜๋Š” ์ธ๋ฑ์Šค ์š”์†Œ์— ๋„๋‹ฌํ•  ๋•Œ ๊นŒ์ง€ ๊ณ„์† ๋ฐ˜๋ณตํ•˜๋ฉฐ ๋…ธ๋“œ๋“ค์„ ์ง€๋‚˜์˜ด.
      for (let i = 0; i < index; i++) {
        node = node.next;
      }
      
      //๊ฒฐ๊ตญ ๋„๋‹ฌํ•œ ๋…ธ๋“œ ๋ฆฌํ„ด.
      return node;
    }
  }
}