[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์ ๊ฐ์ ๊ฒ์ผ๋ก ์ค์ ํ๋ค.
๊ทธ๋ฆผ์ผ๋ก ์ค๋ช ํด๋ณด๋ฉด ์ด๋ฐ ๋๋โฆ? ๊ทผ๋ฐ ๊ตณ์ด tail์ ์ค์ ํด์ค์ผํ๋์ง ๋ชจ๋ฅด๊ฒ ๋ค. ์ด๋ค ๋ ธ๋์ next ๊ฐ์ด nil์ด๋ฉด ์๋์ผ๋ก tail๋ก ํ๋จํ ์๋ ์๋ ๊ฒ ์๋๊ฐ..
์๋ฌดํผ ์ด ์๋ก ๋ง๋ ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ 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์ ๋ค์ ์ฐ๊ฒฐํด์ฃผ๋๋ก ํ๋ค.
๊ทธ๋ฆผ์ผ๋ก ๋ณด๋ฉด ์ด๋ฐ ๊ตฌ์กฐ๋ก ๋์ํ๋ค.
์๊น์ ๊ฐ์ ๋ฃ๋ ์์๋ ๋๊ฐ๊ณ push์์ append๋ก ๋ณ๊ฒฝํ ์ฝ๋๋ฅผ ์คํํ๋ฉด 1 - 2 - 3
์ผ๋ก tail์ ๋ถ์ด์ ์ถ๊ฐ๋๋ ๊ฑธ ์ ์ ์๋ค.
insert(after:) ๊ตฌํํด๋ณด๊ธฐ
insert(after:) ๋ ์ํ๋ ๋ ธ๋ ๋ค์์ ๋ฃ์ ์ ์๋๋ก ๊ตฌํํด์ผ ํ๋ค. ์์๋ฅผ ๋ฐ์ง๋ฉด ์ด๋ ๋ค.
- ๋ฆฌ์คํธ์์ ํน์ ๋ ธ๋๋ฅผ ์ฐพ๋๋ค. (์ํ๋ ๊ฐ์ด ์์ ์๋ ์๋ค.)
- ์๋ก์ด ๋ ธ๋๋ฅผ ํน์ ๋ ธ๋ ๋ค์์ ์ง์ด๋ฃ๋๋ค.
๊ทธ๋ผ ๋จผ์ 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๋ฅผ ์ด์ด๋ถ์ธ๋ค.
๊ทธ๋ฆผ์ผ๋ก ๋ณด๋ฉด ๋ ์ดํด๊ฐ ๋น ๋ฅผ ๊ฒ ๊ฐ๋ค.
์ด์ ์ฝ๋๋ฅผ ์คํ์์ผ ๋ณด๋ฉด
๊ธฐ์กด list์์ 1๋ฒ index์ ์๋ node๋ฅผ ์ฐพ๊ณ ๊ทธ ๋
ธ๋ ๋ค์์ 10000์ ๋ฃ์ด์ฃผ๋๋ก ํ๋ค. ๊ฒฐ๊ณผ๋ 1 - 2 - 10000 - 3
์ผ๋ก ์ ๋์จ๋ค.
์๊ฐ๋ณต์ก๋ ์ ๋ฆฌ
push, append, insert ๋ชจ๋ ์ํ๋ ์์น์ ํ๋ฒ์ ๋ฃ์ผ๋ฏ๋ก O(1). node(at:)๋ง while ๋ฌธ์ ๋์์ผํ๋ฏ๋ก O(i).
๋ค์์๊ฐ์๋ Remove๋กโฆ.!!!
Leave a comment