[DataStructure] ์ด์ค‘ ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ๋ฅผ Swift๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ

2024. 3. 25. 15:20ยทlearnings/Algorithm&DS

https://m.hanbit.co.kr/store/books/book_view.html?p_code=B3450156021
์ด ๊ธ€์€ ์ฑ… '๋‡Œ๋ฅผ ์ž๊ทนํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜' ์—์„œ ๋ฐฐ์šด ๋‚ด์šฉ์„ ์ ๊ทน ์ฐธ๊ณ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
๋˜ํ•œ, ๋ชจ๋“  ์ž๋ฃŒ๊ตฌ์กฐ ๋ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ Swift๋กœ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ์Œ์„ ๋จผ์ € ์•Œ๋ฆฝ๋‹ˆ๋‹ค.

 

* ์ด์ „ ํฌ์ŠคํŒ…๊ณผ ์ด์–ด์ง‘๋‹ˆ๋‹ค!

 

[DataStructure] ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ๋ฅผ Swift๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ

https://m.hanbit.co.kr/store/books/book_view.html?p_code=B3450156021 ์ด ๊ธ€์€ ์ฑ… '๋‡Œ๋ฅผ ์ž๊ทนํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜' ์—์„œ ๋ฐฐ์šด ๋‚ด์šฉ์„ ์ ๊ทน ์ฐธ๊ณ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ๋ชจ๋“  ์ž๋ฃŒ๊ตฌ์กฐ ๋ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ Swift๋กœ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ์Œ์„

bpeeper.tistory.com

 

0. ์„œ๋ก 

Single Linked List๋Š” ํŠน์ • ๋…ธ๋“œ์˜ ์ด์ „ ๋…ธ๋“œ๋“ค์— ๋Œ€ํ•œ ์ ‘๊ทผ์ด ๋ถˆํŽธํ•˜์˜€์Šต๋‹ˆ๋‹ค.
์ด๋กœ ์ธํ•ด ๋…ธ๋“œ์˜ ์‚ฝ์ž…์ด๋‚˜ ์‚ญ์ œ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š”๊ฒƒ๋„ ์กฐ๊ธˆ ๋‹ต๋‹ตํ•œ ๋ฉด์ด ์žˆ์—ˆ์ง€์š”.
์˜ˆ๋ฅผ๋“ค์–ด n๋ฒˆ์งธ ๋…ธ๋“œ๋ฅผ ์‚ญ์ œํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, n-1๋ฒˆ์งธ ๋…ธ๋“œ์— ์ ‘๊ทผํ•˜์—ฌ nextNode๋กœ n๋ฒˆ์งธ ๋…ธ๋“œ๋ฅผ ์‚ญ์ œํ•˜๋Š” ๋“ฑ ๋ง์ด์ฃ !
์ด๋Ÿฐ ๋‹จ์ ์„ ์–ด๋–ป๊ฒŒ ํ•ด์†Œํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”? ์ด์ „ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํ”„๋กœํผํ‹ฐ๋ฅผ ์ถ”๊ฐ€ํ•จ์œผ๋กœ์จ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์„๊ฒƒ ๊ฐ™์ง€ ์•Š๋‚˜์š”?

1. ๊ตฌ์กฐ์ •์˜

์ด์ค‘ ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ(Doubly Linked List)์˜ ๊ฐ ๋…ธ๋“œ๋“ค์€ ์ด์ „ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํ”„๋กœํผํ‹ฐ Prev๋ฅผ ํ†ตํ•ด ์ด์ „ ๋…ธ๋“œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ์ด ๋…ธ๋“œ๋“ค์„ ๋˜๋‹ค์‹œ ์ฃผ๋ ์ฃผ๋  ์—ฐ๊ฒฐํ•˜์—ฌ Linked List๋ฅผ ํ˜•์„ฑํ•˜๋Š” ๊ฒƒ์œผ๋กœ, ๋”๋ธ”๋ฆฌ ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ๊ฐ€ ์™„์„ฑ๋ฉ๋‹ˆ๋‹ค.
์ด์ œ ์ด ๊ตฌ์กฐ์™€ ์‚ฝ์ž… - ์‚ญ์ œ - ํƒ์ƒ‰์„ Swift๋กœ ๊ตฌํ˜„ํ•˜๋„๋ก ํ•˜์ฃ .

2. ๊ตฌํ˜„

์ด์ „ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ€์ง„ ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋ฅผ ์ •์˜๋กœ ์‹œ์ž‘ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

class DoublyNode<T>{
    var prevNode: DoublyNode<T>?
    var nextNode: DoublyNode<T>?
    var data: T?
    init(prevNode: DoublyNode<T>? = nil, nextNode: DoublyNode<T>? = nil, data: T? = nil) {
        self.prevNode = prevNode
        self.nextNode = nextNode
        self.data = data
}

prevNode ํ”„๋กœํผํ‹ฐ๋Š” ์ด์ „ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ๊ฐ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ์ƒ์„ฑ์ž๋„ ๋งŒ๋“ค์–ด ๋‘์—ˆ์Šต๋‹ˆ๋‹ค.


3. ์‚ฝ์ž…

///๋ฆฌ์ŠคํŠธ์˜ ์ฒ˜์Œ์— ๋…ธ๋“œ ์ถ”๊ฐ€
    @discardableResult
    func insertAtFirst(_ newNode: DoublyNode<T>)->DoublyNode<T>{
        if self.head == nil{
            self.head = newNode
            return newNode
        }
        self.head?.prevNode = newNode
        newNode.nextNode = self.head
        self.head = newNode
        return newNode
    }
    ///๋ฆฌ์ŠคํŠธ๋‚ด ํŠน์ • ์œ„์น˜์— ๋…ธ๋“œ ์ถ”๊ฐ€
    @discardableResult
    func InsertNodeAt(_ newNode:DoublyNode<T>, _ idx: Int) -> DoublyNode<T>?{
        if self.head == nil { return nil}
        var currentNode = self.head
        for _ in 0..<idx{
            if currentNode == nil {return nil}
            currentNode = currentNode?.nextNode
        }
        if currentNode?.prevNode == nil{
            self.head = newNode
        }
        currentNode?.prevNode = newNode
        newNode.nextNode = currentNode
        newNode.prevNode = nil
        return newNode
    }
    ///๋ฆฌ์ŠคํŠธ์˜ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์— ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€
    @discardableResult
    func appendNode(_ newNode: DoublyNode<T>)->DoublyNode<T>{
        if self.head == nil {
            self.head = newNode
            return newNode
        }
        var tail = self.head
        while(tail?.nextNode != nil){
            tail = tail?.nextNode
        }
        newNode.nextNode = tail?.nextNode
        newNode.prevNode = tail
        tail?.nextNode = newNode
        return newNode
    }

์ถ”๊ฐ€ํ•  ์œ„์น˜๊นŒ์ง€ ๋ฐ˜๋ณต๋ฌธ์„ ํ†ตํ•ด ๋„๋‹ฌํ•œ ๋’ค, ํ•ด๋‹น ์œ„์น˜์˜ ๋…ธ๋“œ๋ฅผ ์ƒˆ ๋…ธ๋“œ์˜ nextNode์—, ์ด์ „ ๋…ธ๋“œ๋ฅผ prevNode์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

3. ์‚ญ์ œ

///๋ฆฌ์ŠคํŠธ์˜ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์˜ ๋…ธ๋“œ๋ฅผ ์‚ญ์ œ
    @discardableResult
    func removeLast()->DoublyNode<T>?{
        if self.head == nil {
            return nil
        }
        var tail = self.head
        while(tail?.nextNode != nil){
            tail = tail?.nextNode
        }
        tail?.prevNode?.nextNode = nil
        tail?.prevNode = nil
        return tail
    }
    ///๋ฆฌ์ŠคํŠธ์˜ ์ฒ˜์Œ ๋…ธ๋“œ๋ฅผ ์‚ญ์ œ
    @discardableResult
    func removeFirst()->DoublyNode<T>?{
        if self.head == nil{
            return nil
        }
        var removeNode = self.head
        self.head = self.head?.nextNode
        self.head?.prevNode = nil
        return removeNode
    }
    ///๋ฆฌ์ŠคํŠธ์˜ ํŠน์ • ์œ„์น˜ ๋…ธ๋“œ๋ฅผ ์‚ญ์ œ
    @discardableResult
    func removeAt(_ idx: Int)->DoublyNode<T>?{
        if self.head == nil {return nil}
        var removeNode = self.head
        for _ in 0..<idx{
            if removeNode?.nextNode == nil {return nil}
            removeNode = removeNode?.nextNode
        }
        if removeNode?.prevNode == nil { self.head = removeNode?.nextNode}
        removeNode?.prevNode?.nextNode = removeNode?.nextNode
        removeNode?.nextNode?.prevNode = removeNode?.prevNode
        removeNode?.prevNode = nil
        removeNode?.nextNode = nil
        return removeNode
    }

 ํŠน์ • ๋…ธ๋“œ๊นŒ์ง€ ์ด๋™ํ•œ ํ›„ ๋…ธ๋“œ์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ๋น„์›Œ์ฃผ๊ณ , ์ด์ „ ๋…ธ๋“œ์™€ ๋‹ค์Œ ๋…ธ๋“œ์˜ ์ €์žฅ์„ ๋Š์–ด์ฃผ๋ฉด ARC๋งจ์ด ์ฒ˜๋ฆฌํ•ด์ค๋‹ˆ๋‹ค!

4. ํƒ์ƒ‰

///๋ฆฌ์ŠคํŠธ๋‚ด ํŠน์ • ์œ„์น˜์˜ ๋…ธ๋“œ ๋ฐ˜ํ™˜
    @discardableResult
    func getNodeAt(_ idx: Int) -> DoublyNode<T>?{
        if self.head == nil { return nil}
        var currentNode = self.head
        for _ in 0..<idx{
            if currentNode == nil {return nil}
            currentNode = currentNode?.nextNode
        }
        return currentNode
    }

 

5. ๊ฒฐ๋ก 

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


6. ๋ถ€๋ก

์ด๋ฒˆ ๋ถ€๋ก์—์„œ๋Š”,,!
์ฑ…์˜ 'Vitamin Quiz, ๋”๋ธ” ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์—ญ์ˆœ์œผ๋กœ ์ถœ๋ ฅํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•ด ๋ณด์„ธ์š”'๋ฅผ ๊ตฌํ˜„ํ•ด ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
์ €๋Š” ๋ฐ˜๋ณต๋ฌธ์„ ์‚ฌ์šฉํ•ด์„œ ๊ตฌํ˜„ํ•ด๋ณด๋ ค๊ณ  ํ•ด์š”! ์ด๊ฒƒ์ด ์ •๋‹ต์€ ์•„๋‹ˆ๋ฉฐ, ๋ฐฉ๋ฒ•์€ ์—ฌ๋Ÿฌ๊ฐ€์ง€๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ์˜ ์ถœ๋ ฅ์€ ๋…ธ๋“œ์— ์ ‘๊ทผํ•˜์—ฌ data ํ”„๋กœํผํ‹ฐ์— ์ ‘๊ทผํ•จ์œผ๋กœ์จ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ๋‹ค์‹œ ์ด์ „ ๋…ธ๋“œ๋กœ ๋˜๋Œ์•„๊ฐ€๊ณ , ์ƒ๊ธฐ ํ–‰๋™์„ ์ฒซ ๋…ธ๋“œ๊นŒ์ง€ ๋ฐ˜๋ณต ์ˆ˜ํ–‰ํ•˜๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ๋‘ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๊ฒ ๊ตฐ์š”!
ํ˜„์žฌ DoublyLinkedList ํด๋ž˜์Šค๋Š” ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ง์ ‘์ ์œผ๋กœ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š๋‹ค๋Š” ์ ๋„ ์ฐธ๊ณ ํ•ด์•ผ ํ•  ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค.
์ด๋ฅผ ํ† ๋Œ€๋กœ, ํ•จ์ˆ˜์˜ ๋กœ์ง์„ ์ˆœ์„œ๋Œ€๋กœ ๋‚˜์—ดํ•˜๋ฉด,

  1. ๋ฆฌ์ŠคํŠธ์˜ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๋ฅผ ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ์ ‘๊ทผํ•œ๋‹ค.
  2. ํ˜„์žฌ ๋…ธ๋“œ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.
  3. ํ˜„์žฌ ๋…ธ๋“œ์˜ ์ด์ „ ๋…ธ๋“œ๋ฅผ ํ˜„์žฌ ๋…ธ๋“œ๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค.
  4. ์ด์ „ ๋…ธ๋“œ๊ฐ€ nil์ด ์•„๋‹ˆ๋ผ๋ฉด, ๊ณผ์ • 2๋กœ ๋Œ์•„๊ฐ„๋‹ค.
    (ํ›„์— ํฌ์ŠคํŒ…ํ•  ์Šคํƒ์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด 1์˜ ๊ณผ์ •์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์Œ“๊ณ , ์ด๋ฅผ ์ถœ๋ ฅํ•˜๋ฉด ๊ฐ„๋‹จํžˆ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์Šคํฌ์ผ๋Ÿฌ๋ฅผ ์ž ์‹œ ใ…Žใ…Ž..)

์œ„ ๊ณผ์ •์„ ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    ///๋ฆฌ์ŠคํŠธ ๋‚ด์˜ ๋…ธ๋“œ๋ฅผ ์—ญ์ˆœ์œผ๋กœ ๊ฐ ๋…ธ๋“œ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ถœ๋ ฅ
    func printReverse(){
        if self.head == nil{
            print("\(type(of: self)) is empty")
        }
        var currentNode = self.head
        while currentNode?.nextNode != nil{
            currentNode = currentNode?.nextNode
        }
        while currentNode != nil{
            print("\(currentNode?.data)",terminator: " ")
            if currentNode?.prevNode != nil{
                print("->", terminator: " ")
            }
            currentNode = currentNode?.prevNode
        }
    }

 

์†Œ์Šค์ฝ”๋“œ ์ „๋ฌธ

//
//  DoublyLinkedList.swift
//  Swift-Practice
//
//  Created by Yune gim on 2024/03/21.
//
///๋”๋ธ” ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ, ํŠน์ • ๋…ธ๋“œ๋Š” ์ด์ „ ๋…ธ๋“œ์™€ ์ดํ›„ ๋…ธ๋“œ์˜ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.
class DoublyLinkedList<T:Equatable>{
    var head: DoublyNode<T>?
    ///๋ฆฌ์ŠคํŠธ์˜ ์ฒ˜์Œ์— ๋…ธ๋“œ ์ถ”๊ฐ€
    @discardableResult
    func insertAtFirst(_ newNode: DoublyNode<T>)->DoublyNode<T>{
        if self.head == nil{
            self.head = newNode
            return newNode
        }
        self.head?.prevNode = newNode
        newNode.nextNode = self.head
        self.head = newNode
        return newNode
    }
    ///๋ฆฌ์ŠคํŠธ๋‚ด ํŠน์ • ์œ„์น˜์— ๋…ธ๋“œ ์ถ”๊ฐ€
    @discardableResult
    func InsertNodeAt(_ newNode:DoublyNode<T>, _ idx: Int) -> DoublyNode<T>?{
        if self.head == nil { return nil}
        var currentNode = self.head
        for _ in 0..<idx{
            if currentNode == nil {return nil}
            currentNode = currentNode?.nextNode
        }
        if currentNode?.prevNode == nil{
            self.head = newNode
        }
        currentNode?.prevNode = newNode
        newNode.nextNode = currentNode
        newNode.prevNode = nil
        return newNode
    }
    ///๋ฆฌ์ŠคํŠธ์˜ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์— ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€
    @discardableResult
    func appendNode(_ newNode: DoublyNode<T>)->DoublyNode<T>{
        if self.head == nil {
            self.head = newNode
            return newNode
        }
        var tail = self.head
        while(tail?.nextNode != nil){
            tail = tail?.nextNode
        }
        newNode.nextNode = tail?.nextNode
        newNode.prevNode = tail
        tail?.nextNode = newNode
        return newNode
    }
    ///๋ฆฌ์ŠคํŠธ์˜ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์˜ ๋…ธ๋“œ๋ฅผ ์‚ญ์ œ
    @discardableResult
    func removeLast()->DoublyNode<T>?{
        if self.head == nil {
            return nil
        }
        var tail = self.head
        while(tail?.nextNode != nil){
            tail = tail?.nextNode
        }
        tail?.prevNode?.nextNode = nil
        tail?.prevNode = nil
        return tail
    }
    ///๋ฆฌ์ŠคํŠธ์˜ ์ฒ˜์Œ ๋…ธ๋“œ๋ฅผ ์‚ญ์ œ
    @discardableResult
    func removeFirst()->DoublyNode<T>?{
        if self.head == nil{
            return nil
        }
        var removeNode = self.head
        self.head = self.head?.nextNode
        self.head?.prevNode = nil
        return removeNode
    }
    ///๋ฆฌ์ŠคํŠธ์˜ ํŠน์ • ์œ„์น˜ ๋…ธ๋“œ๋ฅผ ์‚ญ์ œ
    @discardableResult
    func removeAt(_ idx: Int)->DoublyNode<T>?{
        if self.head == nil {return nil}
        var removeNode = self.head
        for _ in 0..<idx{
            if removeNode?.nextNode == nil {return nil}
            removeNode = removeNode?.nextNode
        }
        if removeNode?.prevNode == nil { self.head = removeNode?.nextNode}
        removeNode?.prevNode?.nextNode = removeNode?.nextNode
        removeNode?.nextNode?.prevNode = removeNode?.prevNode
        removeNode?.prevNode = nil
        removeNode?.nextNode = nil
        return removeNode
    }
    ///๋ฆฌ์ŠคํŠธ๋‚ด ํŠน์ • ์œ„์น˜์˜ ๋…ธ๋“œ ๋ฐ˜ํ™˜
    @discardableResult
    func getNodeAt(_ idx: Int) -> DoublyNode<T>?{
        if self.head == nil { return nil}
        var currentNode = self.head
        for _ in 0..<idx{
            if currentNode == nil {return nil}
            currentNode = currentNode?.nextNode
        }
        return currentNode
    }
    ///๋ฆฌ์ŠคํŠธ ๋‚ด์˜ ๋…ธ๋“œ ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜
    func getNodeCount()->Int{
        if self.head == nil {return 0}
        var count = 0
        var currentNode = self.head
        while(currentNode != nil){
            print("\(currentNode!.data!)",terminator: "")
            count += 1
            currentNode = currentNode?.nextNode
            if currentNode != nil { print(" -> ",terminator: "")}
        }
        print()
        return count
    }
    ///๋ฆฌ์ŠคํŠธ ๋‚ด์˜ ๋…ธ๋“œ๋ฅผ ์—ญ์ˆœ์œผ๋กœ ๊ฐ ๋…ธ๋“œ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ถœ๋ ฅ
    func printReverse(){
        if self.head == nil{
            print("\(type(of: self)) is empty")
        }
        var currentNode = self.head
        while currentNode?.nextNode != nil{
            currentNode = currentNode?.nextNode
        }
        while currentNode != nil{
            print("\(currentNode?.data)",terminator: " ")
            if currentNode?.prevNode != nil{
                print("->", terminator: " ")
            }
            currentNode = currentNode?.prevNode
        }
    }
}

'learnings > Algorithm&DS' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[DataStructure] ํ 1๋ถ€  (1) 2024.05.01
[DataStructure] ์Šคํƒ  (1) 2024.05.01
[Algorithm] ์ฐจ๋Ÿ‰๊ธฐ์ง€ ์•Œ๊ณ ๋ฆฌ์ฆ˜, ์Šคํƒ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ค‘์œ„ ํ‘œ๊ธฐ๋ฒ•์„ ํ›„์œ„ ํ‘œ๊ธฐ๋ฒ•์œผ๋กœ ๋ณ€ํ™˜  (0) 2024.04.05
[DataStructure] ํ™˜ํ˜• ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ๋ฅผ Swift๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ  (0) 2024.03.26
[DataStructure] ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ๋ฅผ Swift๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ  (0) 2024.03.20
'learnings/Algorithm&DS' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [DataStructure] ์Šคํƒ
  • [Algorithm] ์ฐจ๋Ÿ‰๊ธฐ์ง€ ์•Œ๊ณ ๋ฆฌ์ฆ˜, ์Šคํƒ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ค‘์œ„ ํ‘œ๊ธฐ๋ฒ•์„ ํ›„์œ„ ํ‘œ๊ธฐ๋ฒ•์œผ๋กœ ๋ณ€ํ™˜
  • [DataStructure] ํ™˜ํ˜• ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ๋ฅผ Swift๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ
  • [DataStructure] ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ๋ฅผ Swift๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ
Une.
Une.
์ด์ง„์„ธ์ƒ์† ์ž์œ ๋ฅผ ์ฐพ๋Š” ์‚ฌ๋žŒ์ด ๋‚จ๊ธด ๊ธฐ๋ก
  • Une.
    Une's Dev-log๐Ÿ
    Une.
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • \ (35)
      • log (4)
      • mac (2)
      • learnings (28)
        • ํšŒ๊ณ  (0)
        • Swift (10)
        • PS (10)
        • Algorithm&DS (6)
        • c++ (2)
      • CS (1)
        • ๋„คํŠธ์›Œํฌ (1)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ๋ฐฉ๋ช…๋ก
    • ๊ด€๋ฆฌ์ž
    • ๊ธ€์“ฐ๊ธฐ
  • ๋งํฌ

  • ๊ณต์ง€์‚ฌํ•ญ

  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    ์ž๋ฃŒ๊ตฌ์กฐ
    wwdc25
    ๋งฅ
    ์ฐจ๋Ÿ‰๊ธฐ์ง€์•Œ๊ณ ๋ฆฌ์ฆ˜
    ios
    C++
    ์•Œ๊ณ ๋ฆฌ์ฆ˜
    swift
    ์Šคํƒ
    ํ† ์ดํ”„๋กœ์ ํŠธ
    BFS
    DFS
    ์ฝ”๋“œ์—…
    ๋ฐฑ์ค€
    PS
    ๊ฐ•ํ•œ์ฐธ์กฐ
    ๊ทธ๋ฆฌ๋””
    swift 6.2
    ๋”๋ธ”๋ฆฌ๋งํฌ๋“œ๋ฆฌ์ŠคํŠธ
    ํ™˜ํ˜•๋งํฌ๋“œ๋ฆฌ์ŠคํŠธ
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.3
Une.
[DataStructure] ์ด์ค‘ ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ๋ฅผ Swift๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”