[Swift] (자료구조) 더블 링크드 리스트 / Doubly Linked List

2022. 8. 1. 16:56🐣/자료구조

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
    }
}

DoublyLinkdedList

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("========================")
    }
}

func add 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
}

dfunc searchNode : 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
}

func insert 
head tail : O(1)
other : 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
}

func deleteNode

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
}

func reverse

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
}