[Swift] Linked List 구현

김상우·2022년 2월 2일
0

ref : https://babbab2.tistory.com/86

앱 개발 중에 Text Box 들을 클릭해서 TextView 에 추가하는 기능을 구현해야 했다. 예를들어, "Apple", "Banana", "Cookie" 3 개의 Text Box 를 차례로 누르면 TextView 에 "Apple Banana Cookie" 가 작성된다.

그런데 Text Box 를 한번 더 클릭하면 삭제가 되야한다. 위 상황에서 가운데 있던 "Banana" 를 삭제하면 "Apple Cookie" 가 되야 자연스러울꺼다. 그리고 다시 "Banana" 를 클릭하면 "Apple Cookie Banana" 가 되도록 구현하고 싶었다. Text 길이가 길다면, 자료구조 중간에서 삭제가 많이 일어나는 경우에는 Array 보단 Linked List 를 활용하는게 좋다는건 모두가 알고 있다.

그래서 Swift 로 Linked List 를 구현해봤다.
string 에서 .removeLast() 를 활용하면 쉽게 마지막 문자열만 삭제할 수 있다.


스위프트 코드

import Foundation

// ElementBoxInfo 는 텍스트 박스 인스턴스
class Node {
    var elementBoxInfo: ElementBoxInfo
    var next: Node?
    
    init(elementBoxInfo: ElementBoxInfo, next: Node? = nil){
        self.elementBoxInfo = elementBoxInfo
        self.next = next
    }
}


class LinkedList {
    var head: Node?
    
    // tail 에 추가
    func append(elementBoxInfo: ElementBoxInfo) {
        if head == nil {
            head = Node(elementBoxInfo: elementBoxInfo)
            return
        }
        
        var tempNode = head
        while tempNode?.next != nil {
            tempNode = tempNode?.next
        }
        tempNode?.next = Node(elementBoxInfo: elementBoxInfo)
    }
    
    
    // 중간 노드 삭제
    func remove(elementBoxInfo: ElementBoxInfo) {
        if head == nil { return }
        
        // head 를 삭제할 경우
        if head?.elementBoxInfo.idx == elementBoxInfo.idx {
            head = head?.next
            return
        }
        
        var tempNode = head
        while tempNode?.next?.elementBoxInfo.idx != elementBoxInfo.idx {
            tempNode = tempNode?.next
        }
        
        tempNode?.next = tempNode?.next?.next
    }
    
    
    // TextView 에 띄워줄 String 리턴 함수
    func getTextWithLinkedList() -> String? {
        if head == nil { return nil }
        
        var resultText: String = ""
        var tempNode = head
        while tempNode != nil {
            guard let tempText = tempNode?.elementBoxInfo.text else { return nil }
            resultText += tempText + " "
            tempNode = tempNode?.next
        }
        
        resultText.removeLast()
        return resultText
    }
    
}
profile
안녕하세요, iOS 와 알고리즘에 대한 글을 씁니다.

0개의 댓글