๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ–ฅ Computer Science/Data Structure

[Data Structure] ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž(Linked List)

by Fomagran ๐Ÿ’ป 2021. 8. 11.
728x90
๋ฐ˜์‘ํ˜•

 

์•ˆ๋…•ํ•˜์„ธ์š” Foma๐Ÿ‘Ÿ ์ž…๋‹ˆ๋‹ค.

 

์˜ค๋Š˜์€ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๋ ค๊ณ  ํ•˜๋Š”๋ฐ์š”.

 

์–ผ๋งˆ ์ „์— 2021 ์นด์นด์˜ค ์ธํ„ด์‰ฝ์— ์ถœ์ œ๋˜์—ˆ๋˜ "ํ‘œํŽธ์ง‘" ์ด๋ผ๋Š” ๋ฌธ์ œ๋ฅผ ํ’€๊ฒŒ ๋˜์—ˆ๋Š”๋ฐ

 

ํ•ด๋‹น ๋ฌธ์ œ๋Š” ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ผญ ์‚ฌ์šฉํ•ด์•ผ ํšจ์œจ์„ฑ์„ ํ†ต๊ณผํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์˜€์Šต๋‹ˆ๋‹ค.

 

 ๊ทธ ๋™์•ˆ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•ด๋ณผ ์ผ์ด ๊ฑฐ์˜ ์—†์–ด์„œ ๊ตฌ์ฒด์ ์œผ๋กœ ์•Œ์•„๋ณธ ์ ์ด ์—†์—ˆ๋Š”๋ฐ

 

์ด๋ฒˆ ๊ธฐํšŒ์— ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜ ์žฅ์ ๊ณผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ •๋ฆฌํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

 

๋ฐ”๋กœ ์‹œ์ž‘ํ• ๊ฒŒ์š”~


Linked List๋ž€?

 

"์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ, ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ(linked list)๋Š” ๊ฐ ๋…ธ๋“œ๊ฐ€ ๋ฐ์ดํ„ฐ์™€ ํฌ์ธํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ํ•œ ์ค„๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ์ž๋ฃŒ ๊ตฌ์กฐ์ด๋‹ค. ์ด๋ฆ„์—์„œ ๋งํ•˜๋“ฏ์ด ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ๋…ธ๋“œ๋“ค์ด ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š”๋ฐ, ๋…ธ๋“œ์˜ ํฌ์ธํ„ฐ๊ฐ€ ๋‹ค์Œ์ด๋‚˜ ์ด์ „์˜ ๋…ธ๋“œ์™€์˜ ์—ฐ๊ฒฐ์„ ๋‹ด๋‹นํ•˜๊ฒŒ ๋œ๋‹ค. ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜ ์ข…๋ฅ˜๋กœ๋Š” ๋‹จ์ผ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ, ์ด์ค‘ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ๋“ฑ์ด ์žˆ๋‹ค.
์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋Š” ๋Š˜์–ด์„  ๋…ธ๋“œ์˜ ์ค‘๊ฐ„์ง€์ ์—์„œ๋„ ์ž๋ฃŒ์˜ ์ถ”๊ฐ€์™€ ์‚ญ์ œ๊ฐ€ O(1)์˜ ์‹œ๊ฐ„์— ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์žฅ์ ์„ ๊ฐ–๋Š”๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฐฐ์—ด์ด๋‚˜ ํŠธ๋ฆฌ ๊ตฌ์กฐ์™€๋Š” ๋‹ฌ๋ฆฌ ํŠน์ • ์œ„์น˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•ด ๋‚ด๋Š”๋ฐ์—๋Š” O(n)์˜ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋Š” ๋‹จ์ ๋„ ๊ฐ–๊ณ  ์žˆ๋‹ค." - ์œ„ํ‚ค ๋ฐฑ๊ณผ -

 

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

 

์žฅ์ 

 

์‚ญ์ œ๋‚˜ ์ถ”๊ฐ€๊ฐ€ O(1) ์‹œ๊ฐ„์— ๊ฐ€๋Šฅํ•˜๋‹ค.

 

๋ณดํ†ต ๋ฐฐ์—ด์€ ์•„๋ž˜์™€ ๊ฐ™์ด index๋กœ ํฌ๊ธฐ๊ฐ€ ์ •ํ•ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

์—ฌ๊ธฐ์„œ ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•˜๋ ค๊ณ  ํ•˜๋ฉด ๊ทธ ๋‹ค์Œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋“ค์ด ์žฌ๋ฐฐ์น˜๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

 

 

์ถ”๊ฐ€ ๋˜ํ•œ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ถ”๊ฐ€๋˜๋Š” ์ธ๋ฑ์Šค ๋‹ค์Œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋“ค์ด ์žฌ๋ฐฐ์น˜๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

 

 

ํ•˜์ง€๋งŒ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ญ์ œ๋˜๊ฑฐ๋‚˜ ์ถ”๊ฐ€๋˜๋ฉด ํ•ด๋‹น ๋…ธ๋“œ์˜ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ๋งŒ ๋ณ€๊ฒฝํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์—

 

๋ฐฐ์—ด๋ณด๋‹ค ์‚ญ์ œ๋‚˜ ์ถ”๊ฐ€์—์„œ ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค.

 

 

๋‹จ์ 

 

ํŠน์ • ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋Š”๋ฐ  ๋ฌด์กฐ๊ฑด O(n)์˜ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฐ๋‹ค.

 

๋ฐฐ์—ด์˜ ๊ฒฝ์šฐ ํŠน์ • ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์„ ๋•Œ ์ธ๋ฑ์Šค๊ฐ€ ์žˆ์–ด ๊ฒ€์ƒ‰ํ•  ๋•Œ ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋Š” ์ •ํ•ด์ง„ ์œ„์น˜๋ฅผ ์•Œ์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฒ€์ƒ‰ ์‹œ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆœํšŒํ•ด ํŠน์ • ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 


Linked List ๊ตฌ์กฐ

 

๋‹จ์ผ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋ฅผ ์˜ˆ์‹œ๋กœ ๋“ค๊ฒ ์Šต๋‹ˆ๋‹ค.

 

์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ๋…ธ๋“œ์™€ ํฌ์ธํ„ฐ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๊ณ  ๋‹ค์Œ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

๊ฐ€์žฅ ์ฒซ ๋ฒˆ์งธ ๋…ธ๋“œ๋ฅผ ํ—ค๋”๋ผ๊ณ  ๋ถ€๋ฅด๊ณ  ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๋ฅผ ํ…Œ์ผ์ด๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.


Linked List ์ข…๋ฅ˜

 

1. ๋‹จ์ผ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ

 

๊ฐ ๋…ธ๋“œ ๋‹น ํ•œ ๊ฐœ์˜ ํฌ์ธํ„ฐ๊ฐ€ ์žˆ๊ณ  ํฌ์ธํ„ฐ๋Š” ๋‹ค์Œ ๋…ธ๋“œ์˜ ์œ„์น˜๋ฅผ ๊ฐ€๋ฅดํ‚ต๋‹ˆ๋‹ค.

 

ํ…Œ์ผ์€ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์ด๋ฏ€๋กœ ๋‹ค์Œ์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ๋ฅผ ๊ฐ–์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 

 

2. ์ด์ค‘ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ

 

๋‹จ์ผ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋Š” ํฌ์ธํ„ฐ๋ฅผ ํ•œ ๊ฐœ ๊ฐ€์ง€๊ณ  ์žˆ์–ด ๋‹ค์Œ ๋…ธ๋“œ๋งŒ ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜ ์žˆ์—ˆ๋‹ค๋ฉด

 

์ด์ค‘ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋Š” ํฌ์ธํ„ฐ๋ฅผ ๋‘ ๊ฐœ ๊ฐ€์ง€๊ณ  ์žˆ์–ด ์ด์ „ ๋…ธ๋“œ์™€ ๋‹ค์Œ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.

 

 

3. ์›ํ˜• ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ

 

๋‹จ์ผ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜ ํ…Œ์ผ์— ํฌ์ธํ„ฐ๊ฐ€ ์ถ”๊ฐ€๋œ ํ˜•ํƒœ๋กœ ํ…Œ์ผ์˜ ํฌ์ธํ„ฐ๋Š” ํ—ค๋”๋ฅผ ๊ฐ€๋ฅด์ผœ ์›ํ˜•์ด ๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

 


Code

 

์ง€๊ธˆ๋ถ€ํ„ฐ๋Š” ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ตฌํ˜„ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

(์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ ์ค‘์—์„œ ๋‹จ์ผ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ตฌํ˜„ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.)

 

Node

 

๋…ธ๋“œ๋Š” ํ˜„์žฌ ๊ฐ’๊ณผ ๋‹ค์Œ ๋…ธ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

class Node<T> {
    let value:T
    var next:Node?
    
    init(value:T,next:Node? = nil) {
        self.value = value
        self.next = next
    }
}

 

Linked List

 

ํ—ค๋“œ๊ฐ€ ๋ฌด์กฐ๊ฑด ์กด์žฌํ•˜๋Š” ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋กœ ์„ ์–ธํ–ˆ์Šต๋‹ˆ๋‹ค. 

 

class LinkedList<T> {
    var head:Node<T>!
    init(head:Node<T>) {
        self.head = head
    }   
 }

 

append

 

head๋ถ€ํ„ฐ ๋‹ค์Œ ๋…ธ๋“œ๊ฐ€ ์—†๋Š” ๋…ธ๋“œ๋ฅผ ์ฐพ์•„๋ƒ…๋‹ˆ๋‹ค. (๋งˆ์ง€๋ง‰ ๋…ธ๋“œ)

 

๊ทธ๋ฆฌ๊ณค ํ•ด๋‹น ๋…ธ๋“œ์˜ ๋‹ค์Œ ๋…ธ๋“œ๋ฅผ ํ˜„์žฌ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•ด์ค๋‹ˆ๋‹ค.

 

 func append(value:T) {
        var node:Node = head
        while node.next != nil {
            node = node.next!
        }
        node.next = Node(value: value)
    }

 

insert(at:)

 

๋งŒ์•ฝ 0๋ฒˆ์งธ ์‚ฝ์ž…ํ•œ๋‹ค๋ฉด head๊ฐ€ ๋˜๋ฏ€๋กœ ํ˜„์žฌ ๊ฐ’์„ ๊ฐ€์ง€๋Š” Node๋ฅผ head๋กœ ๋งŒ๋“ค์–ด์ฃผ๊ณ  

 

head์˜ ๋‹ค์Œ ๊ฐ’์„ ์ด์ „์˜ head๋กœ ๋„ฃ์–ด์ค๋‹ˆ๋‹ค.

 

๊ทธ๊ฒŒ ์•„๋‹ˆ๋ผ๋ฉด index์˜ ๋ฐ”๋กœ ์ „ ๋ฒˆ์งธ๋ฅผ ์ฐพ์•„์„œ ๋‹ค์Œ ๊ฐ’์„ ๋ณ€๊ฒฝํ•ด์ค๋‹ˆ๋‹ค.

 

  func insert(value:T,at index:Int) {
        var node = head
        
        if index == 0 {
            let pastHead = head
            head = Node(value: value)
            head.next = Node(value: pastHead!.value,next:pastHead?.next)
            return
        }
   
        for _ in 0..<index-1 {
            node = node?.next
        }
        
        if node?.next == nil {
            fatalError("list์˜ ํฌ๊ธฐ๋ณด๋‹ค index๊ฐ€ ์ปค์„œ insert๊ฐ€ ์•ˆ๋ฉ๋‹ˆ๋‹ค.")
        }
        
        let next = node?.next
        node?.next = Node(value:value,next:next)
    }

 

remove(at:)

 

0๋ฒˆ์งธ๋Š” head๋ฅผ ์ง€์šฐ๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ๊ทธ ๋‹ค์Œ ๊ฐ’์„ head๋กœ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค.

 

0๋ฒˆ์งธ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ํ•ด๋‹น index์˜ ๋ฐ”๋กœ ์ „ Node๋ฅผ ์ฐพ์•„์„œ ๋‹ค์Œ Node ๊ฐ’์„ ๋ณ€๊ฒฝํ•ด์ค๋‹ˆ๋‹ค.

 

    func remove(at index:Int) {
        var node = head
        
        if index == 0 {
            if head.next == nil {
                fatalError("head๋ง๊ณ  ๋‹ค๋ฅธ ๊ฐ’์ด ์—†์–ด์„œ remove๊ฐ€ ์•ˆ๋ฉ๋‹ˆ๋‹ค.")
            }
            head = Node(value: head.next!.value, next: head.next?.next)
            return
        }
        
        for _ in 0..<index-1 {
            node = node?.next
        }
        
        if node?.next == nil {
            fatalError("list์˜ ํฌ๊ธฐ๋ณด๋‹ค index๊ฐ€ ์ปค์„œ remove๊ฐ€ ์•ˆ๋ฉ๋‹ˆ๋‹ค.")
        }
        
        if let next = node?.next?.next {
            node?.next = Node(value:next.value,next:next.next)
        }else {
            node?.next = nil
        }
    }

์ด๋ ‡๊ฒŒ ์˜ค๋Š˜์€ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋ฌด์—‡์ด๊ณ  ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ˜„ํ•ด๋ณด์•˜๋Š”๋ฐ์š”.

 

ํ˜น์‹œ๋ผ๋„ ํ‹€๋ฆฐ ์ ์ด ์žˆ๊ฑฐ๋‚˜ ์ง€์ ํ•ด์ฃผ์‹ค ๋ถ€๋ถ„์ด ์žˆ๋‹ค๋ฉด ์–ธ์ œ๋“  ๋Œ“๊ธ€๋กœ ์•Œ๋ ค์ฃผ์„ธ์š”!

728x90
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€