3 ๋ถ„ ์†Œ์š”

Linked List๐Ÿคฎ

์‚ฌ์ „์ง€์‹

  • Storage โžก๏ธ (HDD/SSD) ๊ฐ€๊ฒฉ์ด ์ €๋ ดํ•˜๋ฉฐ ์šฉ๋Ÿ‰์ด ํฌ๊ณ  ์ „์›์ด ๊บผ์ ธ๋„ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋จ

  • Memory โžก๏ธ (DRAM) ๊ฐ€๊ฒฉ์ด ๋น„์‹ธ๊ณ  ์šฉ๋Ÿ‰์ด ์ ๊ณ  ์ „์›์ด ๊บผ์ง€๋ฉด ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ฌ๋ผ์ง But ์†๋„๊ฐ€ ๋น ๋ฅด๋‹ค

  • CPU โžก๏ธ ๋ฐ์ดํ„ฐ๋ฅผ ๋Œ์–ด๋‹ค ์“ธ๋•Œ Storage๊ฐ€ ์•„๋‹Œ Memory์•ˆ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋Œ์–ด๋‹ค ์”€ ( Memory๊ฐ€ ์†๋„๊ฐ€ ๋น ๋ฅด๊ธฐ ๋•Œ๋ฌธ )


link-1


Array List โžก๏ธ [์ถ”๊ฐ€/์‚ญ์ œ : ๋Š๋ฆผ ( ๋ฉ”๋ชจ๋ฆฌ์ฃผ์†Œ๋ฅผ ํ•œ์นธํ•œ์นธ์”ฉ ๋•ก๊ฒจ์•ผํ•˜๊ธฐ๋•Œ๋ฌธ )] [์ธ๋ฑ์Šค ์กฐํšŒ: ๋น ๋ฆ„ ( ์ฃผ์†Œ๋ฅผ ์•Œ๊ณ ์žˆ์Œ )]

Linked List โžก๏ธ [์ถ”๊ฐ€/์‚ญ์ œ : ๋น ๋ฆ„ ( ์—ฐ๊ฒฐ๋งŒ ์žฌ์„ค์ • ํ•ด์ฃผ๋ฉด๋˜๊ธฐ๋•Œ๋ฌธ )] [์ธ๋ฑ์Šค ์กฐํšŒ: ๋Š๋ฆผ ( ํ•˜๋‚˜ํ•˜๋‚˜ ํƒ€๊ณ  ์กฐํšŒํ•ด์•ผํ•จ )]


link-2


  • node โžก๏ธ dataField + linkField ๊ทธ๋ฆผ์—์„œ๋Š” ์ด 4๊ฐœ์˜ node๊ฐ€ ์กด์žฌํ•จ (JS๋Š” ๊ฐ์ฒด์ง€ํ–ฅ์ด๋ฏ€๋กœ ์ด๊ฒƒ์„ ๊ฐ์ฒด๋กœ ํ‘œํ˜„)

  • data field โžก๏ธ ์‹ค์ œ ๊ฐ’

  • link field โžก๏ธ ๋‹ค์Œ node๊ฐ€ ๋ฌด์—‡์ธ๊ฐ€์— ๋Œ€ํ•ด ์ €์žฅ๋˜์–ด์žˆ์Œ

  • Head โžก๏ธ ์ฒซ๋ฒˆ์ฉจ node๊ฐ€ ๋ฌด์—‡์ธ๊ฐ€์— ๋Œ€ํ•ด ์ €์žฅ๋˜์–ด์žˆ์Œ


์‹ค์ œ๋กœ ๋งŒ๋“ค์–ด๋ณด๊ธฐ

test.js

const LinkedList = function () {
  this.head = null;
  this.size = 0;
};

const Node = function (data) {
  this.data = data;
  this.link = null;
};

์•ž์œผ๋กœ ์ฐ์–ด๋‚ผ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค ํ•จ์ˆ˜๋“ค

LinkedList.prototype.add = function (data) {
  const newNode = new Node(data);
  if (this.head === null) {
    this.head = newNode; // Node { data: 5, link: null } // ํ—ค๋“œ์— ์ฃผ์†Œ๋„ฃ์–ด์ฃผ๊ธฐ
    this.size++;
  } else {
    let currentNode = this.head;
    while (currentNode.link !== null) {
      currentNode = currentNode.link;
    }
    currentNode.link = newNode;
    this.size++;
  }
};

์ƒ์„ฑ์ž์— ์˜ํ•ด ์ƒ์„ฑ๋  ๊ฐ์ฒด๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ”„๋กœํ† ํƒ€์ž…์œผ๋กœ add ํ•จ์ˆ˜ ๊ตฌํ˜„

add() โžก๏ธ ๋งํฌ๋ฆฌ์ŠคํŠธ์— ๊ฐ’์„ ๋„ฃ์–ด์ฃผ๋Š” ํ•จ์ˆ˜๋กœ ๋””์ž์ธํ•จ

  1. ๋…ธ๋“œ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ ํ•œ๋‹ค.

  2. head๊ฐ’์ด null์ด๋ผ๋ฉด head์— ์ƒˆ๋กœ ์ƒ์„ฑํ•œ ๋…ธ๋“œ๋ฅผ ๋„ฃ๋Š”๋‹ค.

  3. head๊ฐ’์ด ์žˆ๋‹ค๋ฉด ๋งํฌ๋ฅผ ํƒ€๊ณ ํƒ€๊ณ  ๋“ค์–ด๊ฐ€ ๋งํฌ๊ฐ’์ด null์ผ๋•Œ, ์ฆ‰ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ์˜ ๊ฐ’์— ์ƒˆ๋กœ ์ƒ์„ฑ๋œ ๋…ธ๋“œ๋ฅผ ๋„ฃ๋Š”๋‹ค.

LinkedList.prototype.insertFirstNode = function (data) {
  const newNode = new Node(data);
  newNode.link = this.head;
  this.head = newNode;
  this.size++;
};

insertFirstNode() โžก๏ธ ์ฒซ๋ฒˆ์งธ๋…ธ๋“œ์— โ€˜๊ฐ’์ด ์ถ”๊ฐ€๋˜๋„๋กโ€™ ๋””์ž์ธํ•จ

  1. ๋…ธ๋“œ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ ํ•œ๋‹ค.

  2. ์ƒ์„ฑ๋œ ๋…ธ๋“œ๊ฐ์ฒด์˜ ๋งํฌ๊ฐ’์œผ๋กœ ํ˜„์žฌ์˜ head๊ฐ’์„ ๋„ฃ์–ด์ค€๋‹ค.

  3. ํ˜„์žฌ์˜ head๊ฐ’์€ ์ƒˆ๋กœ์šด ๋…ธ๋“œ๊ฐ์ฒด์˜ ๊ฐ’์œผ๋กœ ๋Œ€์ฒด๋˜์–ด์ง„๋‹ค.

LinkedList.prototype.insertMiddleNode = function (data, index) {
  const newNode = new Node(data);
  let beforeNode = this.head;
  while (--index !== 0) {
    beforeNode = beforeNode.link;
  }
  let afterNode = beforeNode.link;
  beforeNode.link = newNode;
  newNode.link = afterNode;
  this.size++;
};

insertMiddleNode() โžก๏ธ ์ฒซ๋ฒˆ์งธ ๋…ธ๋“œ๋ฅผ ์ œ์™ธํ•œ ์–ด๋Š๊ณณ์—์„œ๋‚˜ โ€˜๊ฐ’์ด ์ถ”๊ฐ€๋˜๋„๋กโ€™ ๋””์ž์ธํ•จ

  1. ๋…ธ๋“œ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ ํ•œ๋‹ค.

  2. beforeNode๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ํ˜„์žฌ head์˜ ๊ฐ’์„ ๋„ฃ์–ด์ค€๋‹ค.

  3. ์ „๋‹ฌ๋ฐ›์€ index๊ฐ’์„ ํ†ตํ•ด ๊ฐ’์ด ์ถ”๊ฐ€๋˜์–ด์•ผํ•  ์ž๋ฆฌ์˜ ๋ฐ”๋กœ ์•ž ๋…ธ๋“œ๊ฐ์ฒด๋ฅผ beforeNode์— ๋„ฃ์–ด์ค€๋‹ค.

  4. beforeNode์—๋ฅผ ํ†ตํ•ด ์•Œ์•„๋‚ธ ๊ทธ ๋‹ค์Œ ๋…ธ๋“œ๊ฐ์ฒด๋ฅผ ์ƒˆ๋กœ์ƒ์„ฑํ•œ afterNode์— ์ €์žฅํ•œ๋‹ค.

  5. ๊ฐ ๋งํฌ๋“ค์„ ์•Œ๋งž๊ฒŒ ์žฌ์ •์˜ํ•ด์ค€๋‹ค.

LinkedList.prototype.delete = function (index) {
  let beforeNode = this.head;
  if (index >= 1) {
    while (--index !== 0) {
      beforeNode = beforeNode.link;
    }
    let tobeDelete = beforeNode.link;
    let afterNode = beforeNode.link.link;
    beforeNode.link = afterNode;
    delete tobeDelete;
  } else {
    let tobeDelete = beforeNode;
    let afterNode = beforeNode.link;
    this.head = afterNode;
    delete tobeDelete;
  }
  this.size--;
};

delete() โžก๏ธ ์–ด๋Š๊ณณ์ด๋“  ์ƒ๊ด€์—†์ด ๋…ธ๋“œ๋ฅผ ์‚ญ์ œํ•˜๊ณ  ์žฌ์ •์˜ํ•˜๊ฒŒ ๋””์ž์ธํ•จ.

  1. index๊ฐ’์ด 1 ์ด์ƒ์ด๋ผ๋ฉด ๋…ธ๋“œ๋ฅผ ์žฌ์ •์˜ํ•ด์ค€๋‹ค.

  2. index๊ฐ’์ด ๊ทธ ์™ธ ๋ผ๋ฉด head๋ฅผ ์žฌ์ •์˜ํ•ด์ค€๋‹ค.

LinkedList.prototype.showData = function () {
  let currentNode = this.head;
  const result = Array(this.size).fill(0);
  for (let i = 0; i < this.size; i++) {
    result[i] = currentNode.data;
    currentNode = currentNode.link;
  }
  return result;
};

showData() โžก๏ธ ๋งํฌ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐฐ์—ด๋กœ ์žฌ์ •์˜ํ•˜์—ฌ ๋ณผ ์ˆ˜ ์žˆ๊ฒŒ ๋””์ž์ธํ•จ.

  1. fill(value, start, end) ex) fill(5,0,3) 5๋ผ๋Š” ์ˆซ์ž๋กœ 0~3์˜ ์ธ๋ฑ์Šค๊นŒ์ง€ ์ฑ„์›Œ์ฃผ์…ˆ.

  2. ์ฆ‰ fill(0) 0์ด๋ผ๋Š” ์ˆซ์ž๋กœ ์ „๋ถ€๋‹ค ์ฑ„์›Œ์ฃผ์…ˆ.

const a = new LinkedList();
a.add(1); // [1]
a.add(5); // [1,5]
a.add(4); // [1,5,4]
a.insertMiddleNode(3, 2); // [1,5,3,4]
a.delete(0); // [5,3,4]
console.log(a.showData());

๊ฒฐ๊ณผ๋Š” ์„ฑ๊ณต์ .

class ๋ฌธ๋ฒ•์œผ๋กœ ์ฝ”๋“œ์นดํƒ€ ํ’€์–ด๋ณด๊ธฐ

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

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

  addAtHead(val) {
    const newNode = new Node(val);
    if (this.head === null) {
      this.head = newNode;
    } else {
      newNode.next = this.head;
      this.head = newNode;
    }
    this.size++;
  }

  addAtTail(val) {
    const newNode = new Node(val);
    if (this.tail === null) {
      this.tail = newNode;
      let currentNode = this.head;
      while (currentNode.next !== null) {
        currentNode = currentNode.next;
      }
      currentNode.next = this.tail;
    } else {
      let last = this.tail;
      last.next = newNode;
      this.tail = newNode;
    }
    this.size++;
  }

  addAtIndex(index, val) {
    if (index <= this.size - 1) {
      const newNode = new Node(val);
      let beforeNode = this.head;
      while (--index !== 0) {
        beforeNode = beforeNode.next;
      }
      let afterNode = beforeNode.next;
      beforeNode.next = newNode;
      newNode.next = afterNode;
      this.size++;
    } else {
      return;
    }
  }

  deleteAtIndex(index) {
    let beforeNode = this.head;
    if (index >= 1) {
      while (--index !== 0) {
        beforeNode = beforeNode.next;
      }
      let afterNode = beforeNode.next.next;
      delete beforeNode.next;
      beforeNode.next = afterNode;
    } else {
      let afterNode = beforeNode.next;
      delete beforeNode.next;
      this.head = afterNode;
    }
    this.size--;
  }

  get(index) {
    let currentNode = this.head;
    while (index !== 0) {
      if (currentNode.next) {
        currentNode = currentNode.next;
      } else {
        return -1;
      }
      index--;
    }
    return currentNode.val;
  }
}


link-3


์„ฑ๊ณต!!

์—…๋ฐ์ดํŠธ: