๊ธ€ ์ž‘์„ฑ์ž: ๊ฐœ๋ฐœํ•˜๋Š” ํ›ˆ์ด

๋”๋ธ” ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ(Doubly Linked List)

 

๋”๋ธ” ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ๋Š” ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ์™€ ๊ฐœ๋…์€ ๊ฐ™์ง€๋งŒ ๊ฐ ๋…ธ๋“œ๊ฐ€ ์ž์‹ ์˜ ์ด์ „ ๋…ธ๋“œ๊นŒ์ง€ ์•Œ๊ณ ์žˆ๋‹ค๋Š” ์ ์—์„œ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๊ธฐ์กด ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ๋Š” ๊ฐ ๋…ธ๋“œ๊ฐ€ ๋ฐ”๋กœ ๋‹ค์Œ ๋…ธ๋“œ์˜ ์ฐธ์กฐ ๊ฐ’๋งŒ ์•Œ๊ณ  ์žˆ์ง€๋งŒ, ์ด๋ฒˆ์—๋Š” ์ž์‹ ์˜ ์–‘์ชฝ์˜ ๋…ธ๋“œ๋ฅผ ๋ชจ๋‘ ์ฐธ์กฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‚ญ์ œ๋‚˜ ์‚ฝ์ž… ์—ฐ์‚ฐ์˜ ๊ตฌํ˜„์ด ์กฐ๊ธˆ ๋” ์‰ฌ์›Œ์ง‘๋‹ˆ๋‹ค.

 

๋ผˆ๋Œ€ ๋งŒ๋“ค๊ธฐ

Node

import Foundation

class Node<T: Equatable> {
    let id: Int
    let data: T
    var next: Node? = nil
    var prev: Node? = nil
    
    init(id: Int, data: T) {
        self.id = id
        self.data = data
    }
}

 

๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ตฌ์„ฑํ•  ๋…ธ๋“œ๋Š” ๊ฐ์ž ์ž์‹ ์˜ id, ์ €์žฅํ•  ๋ฐ์ดํ„ฐ, ์ด์ „ ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ฐธ์กฐ๊ฐ’๊ณผ ๋‹ค์Œ ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ฐธ์กฐ๊ฐ’์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค.

 

Doubly Linked List

struct DoublyLinkedList<T: Equatable> {
    var head: Node<T>?
    var tail: Node<T>?
    
    var front: Node<T>? {
        return head
    }
    
    var back: Node<T>? {
        return tail
    }
    
    func showAll() {
        var now = head
        print("===== Linked List ======")
        while now != nil {
            now?.next == nil
            ? print("id: \(now!.id) | data: \(now!.data)")
            : print("id: \(now!.id) | data: \(now!.data) -> ")
            now = now?.next
        }
        print("========================")
    }
}

๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ๋Š” head ์™€ tail ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค. head ๋Š” ํ˜„์žฌ ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ์—์„œ ๊ฐ€์žฅ ์•ž์— ์žˆ๋Š” ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ , tail์€ ๊ฐ€์žฅ ๋’ค์— ์žˆ๋Š” ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.

 

front, back ์€ head์™€ tail ํ”„๋กœํผํ‹ฐ๋ฅผ ํ†ตํ•ด์„œ ๊ฐ€์žฅ ์•ž ๋…ธ๋“œ์™€ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ์˜ ์ฐธ์กฐ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ์˜ ๋…ธ๋“œ ๋ชฉ๋ก์„ ์ˆœ์„œ๋Œ€๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” showAll ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

 

์ถ”๊ฐ€ (add) - O(1)

์ƒˆ๋กœ์šด ๋…ธ๋“œ๋ฅผ ๋ฆฌ์ŠคํŠธ ๊ฐ€์žฅ ๋์— ์ถ”๊ฐ€ํ•˜๋Š” ์—ฐ์‚ฐ์€ tail ํฌ์ธํ„ฐ๋ฅผ ์ด์šฉํ•ด์„œ O(1)์— ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‘ ๊ฐ€์ง€ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋Š”๋ฐ์š”,

 

1) ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ์— ์•„๋ฌด ๋…ธ๋“œ๋„ ์—†๋Š” ๊ฒฝ์šฐ

์ด ๊ฒฝ์šฐ์—๋Š” ์ƒˆ๋กœ์šด ๋…ธ๋“œ๋ฅผ head์™€ tail์ด ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์‰ฝ๊ฒŒ ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

2) ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ์— ๋…ธ๋“œ๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ

์ด๋ฏธ ๋ฆฌ์ŠคํŠธ์— ๋…ธ๋“œ๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” tail์ด ๊ฐ€๋ฆฌํ‚ค๋˜ ๋‹ค์Œ ๋…ธ๋“œ๋ฅผ ์ƒˆ๋กœ์šด ๋…ธ๋“œ๋กœ ์ง€์ •ํ•˜๊ณ , ์ƒˆ๋กœ์šด ๋…ธ๋“œ์˜ ์ด์ „ ๋…ธ๋“œ๋ฅผ tail์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ๋…ธ๋“œ๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. 

๊ทธ๋ฆฌ๊ณ  ์ด์ œ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— tail๋„ ํ•œ ์นธ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ด๋™์‹œ์ผœ์ค๋‹ˆ๋‹ค.

 

์–ด๋–ค ๊ฒฝ์šฐ๋“ ์ง€ tail์„ ์‚ฌ์šฉํ•ด ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๋ฅผ ๋ฐ”๋กœ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•ญ์ƒ O(1)์ด ๋ณด์žฅ๋ฉ๋‹ˆ๋‹ค. ์œ„ ๋กœ์ง์„ ๊ตฌํ˜„ํ•˜๋ฉด ์ด๋ ‡๊ฒŒ ๋˜๊ฒ ์ฃ !

    mutating func add(node: Node<T>) {
        if self.head == nil {
            self.head = node
            self.tail = node
            return
        }
        
        self.tail?.next = node
        node.prev = self.tail
        self.tail = node
    }

 

ํƒ์ƒ‰ (search) - O(N)

ํŠน์ •ํ•œ ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฆฌ์ŠคํŠธ์˜ ์ฒซ ๋…ธ๋“œ์ธ head๋ถ€ํ„ฐ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ์ธ tail ๊นŒ์ง€ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ๊ฒ€์‚ฌํ•ด๋ณด์•„์•ผ ์›ํ•˜๋Š” ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด์„œ ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ปค์„œ์ธ now ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ ๋…ธ๋“œ๋กœ ๊ณ„์† ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

now ๋ฅผ ์ด๋™์‹œํ‚ค๋ ค๋ฉด ์žฌ๊ท€์ ์œผ๋กœ, ํ˜น์€ ๋ฐ˜๋ณต๋ฌธ์„ ํ†ตํ•ด์„œ ํ˜„์žฌ ๋…ธ๋“œ์˜ ๋‹ค์Œ ๋…ธ๋“œ๋ฅผ now๋กœ ๋ณ€๊ฒฝํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ƒˆ๋กœ์šด now ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋…ธ๋“œ๊ฐ€ ์›ํ•˜๋Š” ๋…ธ๋“œ๋ผ๋ฉด ํ•ด๋‹น ๋…ธ๋“œ๋ฅผ ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜ํ•ด์ฃผ๋ฉด ๋˜๊ฒ ์ฃ . ํƒ์ƒ‰์€ ์ตœ์•…์˜ ๊ฒฝ์šฐ์—๋Š” ์ „์ฒด ๋…ธ๋“œ๋ฅผ ๋‹ค ๋Œ์•„๋ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— O(N)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ ์š”๊ตฌ๋˜๊ณ , ์ด์ค‘์œผ๋กœ ์—ฐ๊ฒฐ๋œ ๋ฆฌ์ŠคํŠธ๊ฐ€ ๊ทธ๋‹ค์ง€ ๋„์›€์ด ๋˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

    mutating func searchNode(with data: T) -> Node<T>? {
        var now = self.head
        while now?.data != data && now !== tail {
            now = now?.next
        }
        return now
    }

 

์‚ฝ์ž… (insert) - O(1) or O(N)

์ด์ค‘์œผ๋กœ ์—ฐ๊ฒฐ๋œ ๋•๋ถ„์— ์‚ฝ์ž…์ด ์กฐ๊ธˆ ๋” ์‰ฌ์›Œ์กŒ์Šต๋‹ˆ๋‹ค. ์‚ฝ์ž… ์—ฐ์‚ฐ์€ ๊ฒฝ์šฐ์— ๋”ฐ๋ผ์„œ O(1)์— ๋๋‚  ์ˆ˜๋„ ์žˆ๊ณ , O(N)์ด ๊ฑธ๋ฆด ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

 

1) ์‚ฝ์ž…ํ•  ์œ„์น˜๊ฐ€ head๋‚˜ tail์ผ ๋•Œ - O(1)

์ƒˆ๋กœ์šด ๋…ธ๋“œ๋ฅผ ์‚ฝ์ž…ํ•  ์œ„์น˜๊ฐ€ head ๋‚˜ tail์˜ ์•ž๋’ค๋ผ๋ฉด ๋ณ„๋„์˜ ํƒ์ƒ‰๊ณผ์ •์—†์ด ๊ณง๋ฐ”๋กœ ์‚ฝ์ž…์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ O(1)์ด ๋ฉ๋‹ˆ๋‹ค.

4๋ฒˆ๊ณผ 5๋ฒˆ ๋…ธ๋“œ ์‚ฌ์ด์— ์ƒˆ ๋…ธ๋“œ๋ฅผ ๋ผ์›Œ ๋„ฃ๊ณ  ์‹ถ๋‹ค๊ณ  ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๊ฐ€ tail์ด๋ผ๋Š” ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— tail์˜ ์ด์ „ ๋…ธ๋“œ๋ฅผ ์ฐธ์กฐํ•ด ๊ทธ ๋‹ค์Œ ๋…ธ๋“œ๋ฅผ ์ƒˆ๋กœ์šด ๋…ธ๋“œ๋กœ ์ง€์ •ํ•˜๊ณ , 

์ƒˆ๋กœ์šด ๋…ธ๋“œ์˜ ์ด์ „ ๋…ธ๋“œ๋ฅผ tail์˜ ์ด์ „ ๋…ธ๋“œ๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ ์ด์ „๋…ธ๋“œ์™€ ์ƒˆ ๋…ธ๋“œ์˜ ์—ฐ๊ฒฐ์€ ๋๋‚ฌ์œผ๋‹ˆ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ์ธ tail์˜ ์ด์ „๋…ธ๋“œ๋ฅผ ์ƒˆ ๋…ธ๋“œ๋กœ, ์ƒˆ ๋…ธ๋“œ์˜ ๋‹ค์Œ ๋…ธ๋“œ๋ฅผ tail๋กœ ์ง€์ •ํ•ด์ฃผ๋ฉด ์ƒˆ๋กœ์šด ๋…ธ๋“œ์˜ ์‚ฝ์ž…์ด ์™„์„ฑ๋ฉ๋‹ˆ๋‹ค.

 

2) ์‚ฝ์ž…ํ•  ์œ„์น˜๊ฐ€ head๋‚˜ tail์ด ์•„๋‹ ๋•Œ - O(N)

์‚ฝ์ž…ํ•  ์œ„์น˜๊ฐ€ head๋‚˜ tail์ด ์•„๋‹ˆ๋ผ๋ฉด ํ•ด๋‹น ์œ„์น˜๋ฅผ ํƒ์ƒ‰์„ ํ†ตํ•ด ์ฐพ์•„์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋•Œ๋ฌธ์— ์œ„์น˜๋ฅผ ํƒ์ƒ‰ํ•˜๋Š” ์‹œ๊ฐ„ O(N)๊ณผ 1๋ฒˆ ์ฒ˜๋Ÿผ ์‹ค์ œ ์‚ฝ์ž…์„ ์ง„ํ–‰ํ•˜๋Š” ๊ณผ์ • O(1) ์ด ์š”๊ตฌ๋˜์–ด์„œ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(N)์ด ๋ฉ๋‹ˆ๋‹ค. ํƒ์ƒ‰ + ์‚ฝ์ž…์ด ์‹ค์ œ๋กœ ์š”๊ตฌ๋˜๋Š” ๊ฒƒ์ด์ฃ .

    mutating func insert(node: Node<T>, after id: Int) {
        guard head != nil else { return }
        var now = self.head
        if id == self.tail!.id {
            self.add(node: node)
        }
        
        while now?.id != id && now != nil {
            now = now?.next
        }
        if now === self.tail {
            self.tail = node
        }
        node.next = now?.next
        now?.next?.prev = node
        now?.next = node
        node.prev = now
    }
    
    mutating func insert(node: Node<T>, before id: Int) {
        guard head != nil else { return }
        var now = self.head
        
        if id == self.tail?.id {
            now = self.tail
        } else {
            while now?.id != id && now != nil {
                now = now?.next
            }
        }
        
        if now === self.head {
            self.head = node
        }
    
        now?.prev?.next = node
        node.prev = now?.prev
        now?.prev = node
        node.next = now
    }

 

์‚ญ์ œ(delete) - O(1) or O(N)

์‚ญ์ œ ์—ฐ์‚ฐ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฝ์ž…๊ณผ ๋™์ผํ•˜๊ฒŒ ํŠน์ •ํ•œ ๋…ธ๋“œ๊นŒ์ง€์˜ ํƒ์ƒ‰์ด ํ•„์š”ํ•˜๊ณ  ์ดํ›„์— ์‚ญ์ œ๊ฐ€ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์‚ญ์ œํ•  ๋…ธ๋“œ๊ฐ€ head๋‚˜ tail์ผ ๊ฒฝ์šฐ๋Š” ํƒ์ƒ‰์ด ํ•„์š”์—†์œผ๋‹ˆ O(1)์ด ๋˜๊ณ , ๊ทธ ์™ธ์˜ ๋…ธ๋“œ๋“ค์€ O(N)์ด ๋ฉ๋‹ˆ๋‹ค.

 

์‚ญ์ œํ•˜๋Š” ๊ณผ์ •์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 3๋ฒˆ ๋…ธ๋“œ๋ฅผ ์‚ญ์ œํ•œ๋‹ค๊ณ  ํ•ด๋ณผ๊ฒŒ์š”!

์‚ญ์ œํ•  ๋…ธ๋“œ์˜ ๋‹ค์Œ ๋…ธ๋“œ๊ฐ€ ์‚ญ์ œํ•  ๋…ธ๋“œ์˜ ์ด์ „ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์‚ญ์ œํ•  ๋…ธ๋“œ์˜ ์ด์ „ ๋…ธ๋“œ๊ฐ€ ์‚ญ์ œํ•  ๋…ธ๋“œ์˜ ๋‹ค์Œ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆผ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด ์ด์ œ 3๋ฒˆ ๋…ธ๋“œ๋Š” now ํฌ์ธํ„ฐ์— ์˜ํ•ด์„œ๋งŒ ์ฐธ์กฐ๊ฐ€ ๋˜๋Š”๋ฐ์š”, now ํฌ์ธํ„ฐ๋Š” ์‚ญ์ œ ํ•จ์ˆ˜๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ํ•จ๊ป˜ ์‚ฌ๋ผ์ง€๋Š” ๋ณ€์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ์— ARC์— ์˜ํ•ด ํ•จ์ˆ˜๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด์„œ 3๋ฒˆ ๋…ธ๋“œ๋Š” ์‚ฌ๋ผ์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์œ„ ๊ณผ์ •์„ ๊ตฌํ˜„ํ•˜๋ฉด ์ด๋ ‡๊ฒŒ ๋˜๊ฒ ์ฃ ?

    mutating func deleteNode(with id: Int) -> Node<T>? {
        var now = self.head
        
        if id == self.tail?.id {
            now = self.tail
        } else {
            while now?.id != id && now != nil {
                now = now?.next
            }
        }
        
        let deleted = now
        deleted?.next?.prev = deleted?.prev
        deleted?.prev?.next = deleted?.next
        
        if deleted === head {
            self.head = deleted?.next
        }
        
        if deleted === tail {
            self.tail = deleted?.prev
        }
        
        return deleted
    }

 

๋ฆฌ์ŠคํŠธ ๋’ค์ง‘๊ธฐ - O(N)

๋งˆ์ง€๋ง‰์œผ๋กœ ์ผ๋ฐ˜ ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ์—์„œ๋Š” ํ•  ์ˆ˜ ์—†๊ณ  ๋”๋ธ” ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ์—์„œ๋งŒ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ˜์ „ ์—ฐ์‚ฐ์„ ์†Œ๊ฐœํ•˜๊ณ  ๋งˆ์น˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค! ๊ฐ ๋…ธ๋“œ๋“ค์€ ์ž์‹ ์˜ ์ด์ „๊ณผ ๋‹ค์Œ ๋…ธ๋“œ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด์ „์„ ๋‹ค์Œ์œผ๋กœ, ๋‹ค์Œ์œผ๋กœ ์ด์ „์œผ๋กœ ๋ณ€๊ฒฝํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ์žˆ๋˜ ๋ฆฌ์ŠคํŠธ๋ฅผ next์™€ prev๋ฅผ ๋ฐ˜์ „์‹œ์ผœ์„œ ๋’ค์ง‘์œผ๋ฉด,

์ด๋ ‡๊ฒŒ ๋˜๊ฒ ์ฃ ? ํ•˜์ง€๋งŒ ์•„์ง head ์™€ tail์€ ์ด์ „ ์ƒํƒœ์˜ ์–‘๋์„ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Œ€๋กœ ์ถœ๋ ฅ์„ ํ•˜๋ฉด 1๋ฒˆ ๋…ธ๋“œ๋ฅผ ์ถœ๋ ฅํ•œ ์ดํ›„์— ๊ณง๋ฐ”๋กœ nil์ด ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. head ์™€ tail๋„ ๊ตํ™˜ํ•ด์ค์‹œ๋‹ค!

์ด์ œ ์™„๋ฒฝํ•˜๊ฒŒ ๋’ค์ง‘์–ด์ง„ ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค!

 

์œ„ ๊ณผ์ •์— ๋Œ€ํ•œ ๊ตฌํ˜„์€ ์ด๋ ‡์Šต๋‹ˆ๋‹ค.

    mutating func reverse() {
        var now = head
        while now != nil {
            let nowNext = now?.next
            now?.next = now?.prev
            now?.prev = nowNext
            now = now?.prev
        }
        let nowHead = self.head
        self.head = self.tail
        self.tail = nowHead
    }

 

์ „์ฒด ์ฝ”๋“œ

 

 

GitHub - jeonyeohun/Data-Structures-In-Swift: ๐Ÿ‘ท๐Ÿป‍โ™‚๏ธ STL ์™œ ์—†์–ด.. ์Šค์œ„ํ”„ํŠธ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ

๐Ÿ‘ท๐Ÿป‍โ™‚๏ธ STL ์™œ ์—†์–ด.. ์Šค์œ„ํ”„ํŠธ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ. Contribute to jeonyeohun/Data-Structures-In-Swift development by creating an account on GitHub.

github.com

์ž๋ฃŒ๊ตฌ์กฐ ์‹œ๋ฆฌ์ฆˆ์˜ ์ฝ”๋“œ๋“ค์€ ์ด ๋ ˆํฌ์—์„œ ๋ชจ๋‘ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด์š”!