[Data Structures] LinkedList

์š”์ฆ˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ…Œ์ŠคํŠธ๋ฅผ ์ค€๋น„ํ•˜๋‹ค ๋ณด๋ฉด ๊ฐ„ํ˜น๊ฐ€๋‹ค ์ž๋ฃŒ๊ตฌ์กฐ์— ๋Œ€ํ•œ ์ง€์‹์ด ์žˆ์–ด์•ผ ํ’€ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๋“ค์ด ๋‚˜์˜ฌ ๋•Œ๊ฐ€ ์žˆ๋‹ค.

๋ฌผ๋ก  ํ•™๋ถ€์ƒ๋•Œ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๊ณต๋ถ€ํ–ˆ์—ˆ์ง€๋งŒ ๊ทธ ๋•Œ๋Š” C์–ธ์–ด๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒŒ ์ฃผ๋œ ๊ณผ์ œ์˜€๊ณ  ์ง€๊ธˆ์€ Swift๋ฅผ ๋” ๋งŽ์ด ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— Swift๋กœ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ •๋ฆฌ ํ•  ํ•„์š”๊ฐ€ ์žˆ์„ ๊ฒƒ ๊ฐ™์•„์„œ ์‹œ์ž‘ํ•œ ์ž๋ฃŒ๊ตฌ์กฐ ๊ณต๋ถ€..

์˜ค๋Š˜์€ LinkedList ๋ถ€ํ„ฐ ๊ณต๋ถ€ํ•ด๋ณด๊ธฐ๋กœ ํ•œ๋‹ค.

LinkedList

LinkedList๋Š” ๊ฐ’๋“ค์ด ํ•œ ๋ฐฉํ–ฅ์œผ๋กœ ์—ฐ๊ฒฐ๋œ collection์ด๋‹ค. ๋ชจ์–‘์œผ๋กœ ๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

์š” ์ด๋ฏธ์ง€์—์„œ ๋ณด๋“ฏ ๋™๊ทธ๋ž€ ์นธ ์•ˆ์— ์ˆซ์ž๊ฐ€ ์žˆ๊ณ  ํ™”์‚ดํ‘œ๋กœ ์—ฐ๊ฒฐ์ด ๋˜์–ด์žˆ๋Š”๋ฐ, ์ด๊ฒƒ์„ Node ๋“ค์ด ์—ฐ๊ฒฐ ๋ผ์žˆ๋‹ค๊ณ  ๋งํ•œ๋‹ค.

Node

linked list์—์„œ ์‚ฌ์šฉํ•˜๋Š” Node๋Š” ๋‘๊ฐ€์ง€๋ฅผ ๋‹ด๋‹นํ•œ๋‹ค.

  • ๊ฐ’ ์ €์žฅ
  • ๋‹ค์Œ ๋…ธ๋“œ์— ๋Œ€ํ•œ reference ์ €์žฅ. (list์˜ ๋งˆ์ง€๋ง‰ node๋Š” ๋‹ค์Œ ๋…ธ๋“œ๊ฐ€ ์—†์œผ๋ฏ€๋กœ nil์ด ์ €์žฅ๋œ๋‹ค.)

์ด ๋…ธ๋“œ๋ฅผ ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•ด๋ณด์ž. ์šฐ์„  ๋…ธ๋“œ๊ฐ€ ํ•  ์ผ์ธ ์œ„์˜ ๋‘ ๊ฐ€์ง€๋ฅผ ํฌํ•จํ•ด์•ผํ•œ๋‹ค.

class Node<T> {
    var value: T
    var next: Node?
    
    init(value: T, next: Node? = nil) {
        self.value = value
        self.next = next
    }
}

Node ํด๋ž˜์Šค๋Š” ์–ด๋–ค ๊ฐ’๋„ ๋„ฃ์„ ์ˆ˜ ์žˆ๋„๋ก ์ œ๋„ค๋ฆญ์œผ๋กœ ์„ ์–ธํ–ˆ๋‹ค.

์ฒ˜์Œ ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค ๋•Œ node์˜ ๊ฐ’๊ณผ ๋‹ค์Œ node๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋„๋ก ํ–ˆ๋‹ค.

๊ทธ๋Ÿผ ์š”๊ฑธ ๊ฐ€์ง€๊ณ  Node๋ฅผ ๋งŒ๋“ค์–ด ์—ฐ๊ฒฐ์„ ํ•ด๋ณด๋ฉด

print๋กœ node1์„ ์ฐ์–ด๋ดค์„ ๋•Œ ์ž˜ ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. (์ถœ๋ ฅ ๋ฉ”์„œ๋“œ๋Š” ๊นƒํ—™์—์„œ ํ™•์ธ ๊ฐ€๋Šฅํ•˜๋‹ค.)

LinkedList

์ด๋ฒˆ์—” ๋…ธ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์ง„์งœ ๋งํฌ๋“œ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค์–ด๋ณด์ž. (๋…ธ๋“œ๋งŒ ๊ฐ€์ง€๊ณ ๋Š” ํ•˜๋‚˜ํ•˜๋‚˜ ๋…ธ๋“œ๋ฅผ ์„ ์–ธํ•˜๊ณ  ๊ทธ๊ฒƒ๋“ค์„ ์ˆœ์„œ๋Œ€๋กœ next์— ํ• ๋‹นํ•ด์ค˜์•ผํ•˜๋Š” ๊ท€์ฐฎ์Œ์ด ์žˆ์œผ๋ฏ€๋กœ ๋งํฌ๋“œ๋ฆฌ์ŠคํŠธ์—์„œ๋Š” ์‚ฝ์ž…๊ณผ ์ œ๊ฑฐ๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ๋ฉ”์„œ๋“œ๋„ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค.)

๋งํฌ๋“œ๋ฆฌ์ŠคํŠธ์—์„œ ํ•„์š”ํ•œ ๊ฒƒ์„ ์ƒ๊ฐํ•ด๋ณด๋ฉด ์•„๋ž˜ ์ •๋„๊ฐ€ ์ƒ๊ฐ์ด ๋‚œ๋‹ค. ์ฐจ๊ทผ์ฐจ๊ทผ ์ •๋ฆฌ๋ฅผ ํ•ด๋ณด์ž.

  1. head (๋งํฌ๋“œ๋ฆฌ์ŠคํŠธ์˜ ์ฒซ ๋…ธ๋“œ)
  2. tail (๋งํฌ๋“œ๋ฆฌ์ŠคํŠธ์˜ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ)
  3. ์‚ฝ์ž…
  4. ์ œ๊ฑฐ
struct LinkedList<T> {
    var head: Node<T>?
    var tail: Node<T>?
    
    init() {}
    
    var isEmpty: Bool { return head == nil }
}

์šฐ์„ ์€ head์™€ tail ๋…ธ๋“œ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” LinkList ๊ตฌ์กฐ์ฒด๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค. ๋‹ค์Œ ํฌ์ŠคํŒ…์—์„œ ์‚ฝ์ž…, ๊ทธ ๋‹ค์Œ ํฌ์ŠคํŒ…์—์„œ ์ œ๊ฑฐ๋ฅผ ์ •๋ฆฌํ•œ๋‹ค.

Leave a comment