javascript-algorithms

Doubly Linked List

Read this in other languages: ะ ัƒััะบะธะน, ็ฎ€ไฝ“ไธญๆ–‡, ๆ—ฅๆœฌ่ชž, Portuguรชs

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

์ด์ค‘ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ

๋‘ ๊ฐœ์˜ ๋…ธ๋“œ ๋งํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์–ด๋Š ๋ฐฉํ–ฅ์œผ๋กœ๋“  ๋ฆฌ์ŠคํŠธ๋ฅผ ์ˆœํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ค‘ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์—์„œ ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ œ๊ฑฐํ•˜๋ ค๋ฉด, ๋‹จ์ผ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์—์„œ ๋™์ผํ•œ ์ž‘์—…๋ณด๋‹ค ๋” ๋งŽ์€ ๋งํฌ๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•˜์ง€๋งŒ, ์ฒซ ๋ฒˆ์งธ ๋…ธ๋“œ ์ด์™ธ์˜ ๋…ธ๋“œ์ธ ๊ฒฝ์šฐ ์ž‘์—…์„ ์ถ”์ ํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฏ€๋กœ ์ž‘์—…์ด ๋” ๋‹จ์ˆœํ•ด์ ธ ์ž ์žฌ์ ์œผ๋กœ ๋” ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค. ๋ฆฌ์ŠคํŠธ ์ˆœํšŒ ์ค‘ ์ด์ „ ๋…ธ๋“œ ๋˜๋Š” ๋งํฌ๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ด์ „ ๋…ธ๋“œ๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด ๋ฆฌ์ŠคํŠธ๋ฅผ ์ˆœํšŒํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ๋™์ž‘์„ ์œ„ํ•œ Pseudocode

์‚ฝ์ž…

Add(value)
  Pre: value๋Š” ๋ฆฌ์ŠคํŠธ์— ์ถ”๊ฐ€ํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฐ’
  Post: value๋Š” ๋ชฉ๋ก์˜ ๋์— ๋ฐฐ์น˜๋จ
  n โ† node(value)
  if head = รธ
    head โ† n
    tail โ† n
  else
    n.previous โ† tail
    tail.next โ† n
    tail โ† n
  end if
end Add

์‚ญ์ œ

Remove(head, value)
  Pre: head๋Š” ๋ฆฌ์ŠคํŠธ์˜ ์•ž๋‹จ์— ์œ„์น˜
       value๋Š” ๋ฆฌ์ŠคํŠธ์—์„œ ์ œ๊ฑฐํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฐ’
  Post: value๊ฐ€ ๋ฆฌ์ŠคํŠธ์—์„œ ์ œ๊ฑฐ๋˜๋ฉด true; ์•„๋‹ˆ๋ผ๋ฉด false;
  if head = รธ
    return false
  end if
  if value = head.value
    if head = tail
      head โ† รธ
      tail โ† รธ
    else
      head โ† head.next
      head.previous โ† รธ
    end if
    return true
  end if
  n โ† head.next
  while n = รธ and value !== n.value
    n โ† n.next
  end while
  if n = tail
    tail โ† tail.previous
    tail.next โ† รธ
    return true
  else if n = รธ
    n.previous.next โ† n.next
    n.next.previous โ† n.previous
    return true
  end if
  return false
end Remove

์—ญ์ˆœํšŒ

ReverseTraversal(tail)
  Pre: tail์€ ๋ฆฌ์ŠคํŠธ์—์„œ ์ˆœํšŒํ•˜๊ณ ์ž ํ•˜๋Š” ๋…ธ๋“œ
  Post: ๋ฆฌ์ŠคํŠธ๊ฐ€ ์—ญ์ˆœ์œผ๋กœ ์ˆœํšŒ๋จ
  n โ† tail
  while n = รธ
    yield n.value
    n โ† n.previous
  end while
end Reverse Traversal

๋ณต์žก๋„

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

Access Search Insertion Deletion
O(n) O(n) O(1) O(n)

๊ณต๊ฐ„ ๋ณต์žก๋„

O(n)

์ฐธ๊ณ