[Data Structures] LinkedList - Adding Values

Adding Values

์ด๋ฒˆ์—” LinkedList์— ๊ฐ’์„ ์ถ”๊ฐ€ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ํ™•์ธ!

๊ฐ’ ์ถ”๊ฐ€์—๋Š” ์„ธ ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

  • ์•ž์— ๋„ฃ๊ธฐ(push),
  • ๋’ค์— ๋„ฃ๊ธฐ(append),
  • ์–ด๋–ค ๊ฐ’ ๋ฐ”๋กœ ๋’ค์— ๋„ฃ๊ธฐ(insert:after).

์š” ํฌ์ŠคํŒ…์—์„œ๋Š” ์„ธ ๊ฐ€์ง€๋ฅผ ๊ฐ๊ฐ ๊ตฌํ˜„ํ•ด๋ณด๊ณ  ์‹œ๊ฐ„๋ณต์žก๋„๋„ ์•Œ์•„๋ณด๋„๋ก ํ•œ๋‹ค.

push ๊ตฌํ˜„ํ•ด๋ณด๊ธฐ

push๋Š” ์–ด๋–ค ๊ฐ’์„ LinkedList์˜ ๊ฐ€์žฅ ์•ž์— ์‚ฝ์ž…ํ•œ๋‹ค.

LinkedList์˜ ๊ฐ€์žฅ ์•ž์— ๋„ฃ๋Š”๋‹ค๋Š” ๋ง์€ head์˜ ๊ฐ’์ด ๋ฐ”๋€๋‹ค๋Š” ๋ง์ด๊ธฐ๋„ ํ•˜๋ฏ€๋กœ head-first insertion ์ด๋ผ๊ณ ๋„ ํ•œ๋‹ค.

push๋ฅผ ๊ตฌํ˜„ํ•ด๋ณด์ž.

    mutating func push(value: T) {
        self.head = Node(value: value, next: self.head)
        if self.tail == nil {
            self.tail = self.head
        }
    }

LinkedList๋ฅผ ๊ตฌ์กฐ์ฒด๋กœ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•ด mutating ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

head-first insertion์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ์กด์— ์žˆ๋˜ ๋…ธ๋“œ๋ฅผ ์ƒ์„ฑํ•ด ๋…ธ๋“œ์˜ ๋‹ค์Œ ๋…ธ๋“œ๋ฅผ head๋กœ ์„ค์ •ํ•ด์ค€๋‹ค.

๋งŒ์•ฝ tail์ด ์—†๋‹ค๋ฉด Node๊ฐ€ ๋ฐฉ๊ธˆ ์ƒ์„ฑํ•œ ๊ฒƒ ํ•˜๋‚˜๋งŒ ์žˆ์œผ๋ฏ€๋กœ head์™€ tail์„ ๊ฐ™์€ ๊ฒƒ์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

image

๊ทธ๋ฆผ์œผ๋กœ ์„ค๋ช…ํ•ด๋ณด๋ฉด ์ด๋Ÿฐ ๋Š๋‚Œโ€ฆ? ๊ทผ๋ฐ ๊ตณ์ด tail์„ ์„ค์ •ํ•ด์ค˜์•ผํ•˜๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ๋‹ค. ์–ด๋–ค ๋…ธ๋“œ์˜ next ๊ฐ’์ด nil์ด๋ฉด ์ž๋™์œผ๋กœ tail๋กœ ํŒ๋‹จํ•  ์ˆ˜๋„ ์žˆ๋Š” ๊ฒŒ ์•„๋‹Œ๊ฐ€..

image

์•„๋ฌดํŠผ ์ด ์ƒˆ๋กœ ๋งŒ๋“  ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  LinkedList์— ๊ฐ’์„ ์ถ”๊ฐ€ํ•˜๊ณ  print๋ฅผ ํ•ด๋ณด๋ฉด ๋’ค์— ๋„ฃ์€ ๊ฐ’์ด ๊ฐ€์žฅ ์•ž์— ๊ฐ€๋Š” 3 - 2 - 1 ๋ชจ์–‘์œผ๋กœ ์ถœ๋ ฅ๋˜๋Š” ๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

append ๊ตฌํ˜„ํ•ด๋ณด๊ธฐ

append๋Š” ๋ฆฌ์ŠคํŠธ์˜ ๊ฐ€์žฅ ๋’ค์— ๋ถ™์ด๋Š” ๋ฐฉ์‹์ด๋‹ค. tail์ด ๋Š˜์–ด๋‚˜๋ฏ€๋กœ tail-end-insertion ์ด๋ผ๊ณ ๋„ ๋ถ€๋ฅธ๋‹ค.

push์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ตฌ์กฐ์ฒด์˜ ๊ฐ’์„ ๋ฐ”๊พธ๊ธฐ ๋•Œ๋ฌธ์— mutating ํ‚ค์›Œ๋“œ๋ฅผ ๋ถ™์—ฌ ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.

   mutating func append(value: T) {
        guard self.isEmpty == false else {
            self.push(value: value)
            return
        }
        
        self.tail?.next = Node(value: value)
        self.tail = self.tail?.next
    }

push์™€ ๋‹ค๋ฅด๊ฒŒ ์กฐ๊ธˆ ์ฝ”๋“œ๊ฐ€ ๊ธธ๋‹ค. tail์— ๋„ฃ๊ธฐ ๋•Œ๋ฌธ์ธ๋ฐ, isEmpty๊ฐ€ true๋ผ๋ฉด ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋น„์–ด์žˆ๋Š” ๊ฒƒ์ด๋ฏ€๋กœ push๋ฅผ ํ†ตํ•ด head์™€ tail์„ ์„ค์ •ํ•ด์ค€๋‹ค. ๊ทธ๊ฒŒ ์•„๋‹ˆ๋ผ๋ฉด ์ด๋ฏธ ๊ฐ’์ด ๋“ค์–ด์žˆ๋Š” ๋ฆฌ์ŠคํŠธ์ด๋ฏ€๋กœ ์ƒˆ๋กœ์šด ๋…ธ๋“œ๋ฅผ ์ƒ์„ฑํ•ด tail์˜ ๋’ค์— ์—ฐ๊ฒฐํ•ด์ฃผ๋„๋ก ํ•œ๋‹ค.

image

๊ทธ๋ฆผ์œผ๋กœ ๋ณด๋ฉด ์ด๋Ÿฐ ๊ตฌ์กฐ๋กœ ๋™์ž‘ํ•œ๋‹ค.

image

์•„๊นŒ์™€ ๊ฐ’์„ ๋„ฃ๋Š” ์ˆœ์„œ๋Š” ๋˜‘๊ฐ™๊ณ  push์—์„œ append๋กœ ๋ณ€๊ฒฝํ•œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด 1 - 2 - 3 ์œผ๋กœ tail์— ๋ถ™์–ด์„œ ์ถ”๊ฐ€๋˜๋Š” ๊ฑธ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

insert(after:) ๊ตฌํ˜„ํ•ด๋ณด๊ธฐ

insert(after:) ๋Š” ์›ํ•˜๋Š” ๋…ธ๋“œ ๋‹ค์Œ์— ๋„ฃ์„ ์ˆ˜ ์žˆ๋„๋ก ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค. ์ˆœ์„œ๋ฅผ ๋”ฐ์ง€๋ฉด ์ด๋ ‡๋‹ค.

  1. ๋ฆฌ์ŠคํŠธ์—์„œ ํŠน์ • ๋…ธ๋“œ๋ฅผ ์ฐพ๋Š”๋‹ค. (์›ํ•˜๋Š” ๊ฐ’์ด ์—†์„ ์ˆ˜๋„ ์žˆ๋‹ค.)
  2. ์ƒˆ๋กœ์šด ๋…ธ๋“œ๋ฅผ ํŠน์ • ๋…ธ๋“œ ๋‹ค์Œ์— ์ง‘์–ด๋„ฃ๋Š”๋‹ค.

๊ทธ๋Ÿผ ๋จผ์ € node๊ฐ€ ์–ด๋”” ์žˆ๋Š”์ง€๋ฅผ ํ™•์ธํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

    func node(at index: Int) -> Node<T>? {
        var currentNode = self.head
        var currentIndex = 0
        
        while currentNode != nil, currentIndex < index {
            currentNode = currentNode?.next
            currentIndex += 1
        }
        
        return currentNode
    }

head๋ถ€ํ„ฐ ์›ํ•˜๋Š” index ์ „๊นŒ์ง€ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ˆœํšŒํ•˜๋ฉฐ ์›ํ•˜๋Š” index์˜ node๋ฅผ ์ฐพ์•„์ค€๋‹ค. ๋งŒ์•ฝ nil์ธ ๊ฒฝ์šฐ๋Š” ์›ํ•˜๋Š” index๋ณด๋‹ค ๋ฆฌ์ŠคํŠธ๊ฐ€ ์งง์€ ๊ฒƒ์ด๋ฏ€๋กœ nil์ด return๋œ๋‹ค.

๊ทธ๋Ÿผ ์›ํ•˜๋Š” ์œ„์น˜์— node๋ฅผ ๋„ฃ๋Š” insert(after:) ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•ด๋ณด์ž.

   mutating func insert(value: T, after node: Node<T>?) {
        guard let node = node, self.tail !== node else {
            self.append(value: value)
            return
        }
        
        node.next = Node(value: value, next: node.next)
    }

์–ด๋–ค ๋…ธ๋“œ๋ฅผ ๋˜์ ธ์ฃผ๋ฉด ์šฐ์„  ๊ทธ ๋…ธ๋“œ๊ฐ€ ๋ฆฌ์ŠคํŠธ์˜ tail ์œ„์น˜์— ์žˆ๋Š”์ง€ ํŒ๋‹จํ•œ๋‹ค. (tail์ด๋ผ๋ฉด append๋กœ ์ถ”๊ฐ€ํ•˜๋ฉด ๋˜๋ฏ€๋กœ)

๋„˜๊ฒจ์ค€ ๋…ธ๋“œ๊ฐ€ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ๋…ธ๋“œ์˜ ๋’ค์— ์ƒˆ๋กœ์šด ๋…ธ๋“œ๋ฅผ ์—ฐ๊ฒฐํ•˜๊ณ , ์ƒˆ๋กœ์šด ๋…ธ๋“œ์˜ next์— ๊ธฐ์กด node์˜ next๋ฅผ ์ด์–ด๋ถ™์ธ๋‹ค.

๊ทธ๋ฆผ์œผ๋กœ ๋ณด๋ฉด ๋” ์ดํ•ด๊ฐ€ ๋น ๋ฅผ ๊ฒƒ ๊ฐ™๋‹ค.

image

์ด์ œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰์‹œ์ผœ ๋ณด๋ฉด

image

๊ธฐ์กด list์—์„œ 1๋ฒˆ index์— ์žˆ๋Š” node๋ฅผ ์ฐพ๊ณ  ๊ทธ ๋…ธ๋“œ ๋‹ค์Œ์— 10000์„ ๋„ฃ์–ด์ฃผ๋„๋ก ํ–ˆ๋‹ค. ๊ฒฐ๊ณผ๋Š” 1 - 2 - 10000 - 3 ์œผ๋กœ ์ž˜ ๋‚˜์˜จ๋‹ค.

์‹œ๊ฐ„๋ณต์žก๋„ ์ •๋ฆฌ

image

push, append, insert ๋ชจ๋‘ ์›ํ•˜๋Š” ์œ„์น˜์— ํ•œ๋ฒˆ์— ๋„ฃ์œผ๋ฏ€๋กœ O(1). node(at:)๋งŒ while ๋ฌธ์„ ๋Œ์•„์•ผํ•˜๋ฏ€๋กœ O(i).

๋‹ค์Œ์‹œ๊ฐ„์—๋Š” Remove๋กœโ€ฆ.!!!

Leave a comment