LinkedList๋?
์ฐ๊ฒฐ๋ฆฌ์คํธ(LinkedList)๋ ๋ ธ๋๊ฐ ๋ฐ์ดํฐ์ ํฌ์ธํฐ๋ฅผ ๊ฐ์ง๊ณ ํ ์ค๋ก ์ฐ๊ฒฐ ๋์ด ์๋ ๋ฐฉ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ์๋ฃ ๊ตฌ์กฐ์ด๋ค.
์ด๋ฆ ๊ทธ๋๋ก ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ ์์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ ๋ ธ๋๋ค์ด ์ฐ๊ฒฐ๋ ๋ฆฌ์คํธ๋ฅผ ๋งํ๋ค. ๋ ธ๋๋ ๋ ์์ญ์ผ๋ก ๋๋์ด์ง๋๋ฐ ๋ฐ๋ก ๋ฐ์ดํฐ ์์ญ๊ณผ ํฌ์ธํฐ์ด๋ค. ๋ฐ์ดํฐ ์์ญ์๋ ๋น์ฐํ ๋ฐ์ดํฐ๋ฅผ ๋ด๋ ์์ญ์ด๋ฉฐ, ํฌ์ธํฐ๋ ๋ค์์ด๋ ์ด์ ์ ๋ ธ๋์ ์ฐธ์กฐ๊ฐ์ ๊ฐ์ง๊ณ ์์ด ๋ค๋ฅธ ๋ ธ๋์์ ์ฐ๊ฒฐ์ ๋ด๋นํ๋ค.
LinkedList ํน์ง
LinkedList์ ์ฒซ๋ฒ์งธ ํน์ง์ผ๋ก๋ ํ๋์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์์ฐจ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณด๊ดํ๋(์ ์ ํ ๋น) ๋ฐฐ์ด๊ณผ๋ ๋ฌ๋ฆฌ ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ ๊ฐ๊ฐ ๋จ์ด์ง ๊ณต๊ฐ์ ์กด์ฌํ๋ ๋ฐ์ดํฐ๋ฅผ ์ฐธ์กฐ๊ฐ์ ํตํด ์ฐ๊ฒฐํด ๋์ ๊ฒ(๋์ ํ ๋น)์ด๋ผ๋ ์ ์ด๋ค.
- ๊ทธ๋ฆผ1
๋ ๋ฐฐ์ด์ฒ๋ผ ์ค๊ฐ์ ์์๋ฅผ ์ฝ์ ๋๋ ์ญ์ ์ ์ฌ๋ฐฐ์น์ ๋ฐ์ํ๋ ์ค๋ฒํค๋๋ ๋ฐ์ํ์ง ์๋๋ค.(๋ฐฐ์ด์ ๊ฒฝ์ฐ๋ ๋ง์น ์ผ์๋ก ๋ ๊ตํ์์์ ์์ ์๋ ์ฌ๋๋ค ์ฌ์ด์ ์์ผ๋ ค๋ ํ์์ ๊ฐ๋ค: ํ๋ช ๋๋ฌธ์ ๋ง์ ์ฌ๋์ด ํ์นธ์ฉ ๋น๊ฒจ ์๊ฑฐ๋ ํ์นธ์ฉ ๋น์ผ์ค์ผํจ)
- ์ฐ๊ฒฐ๋ฆฌ์คํธ ์ฌ๋ฐฐ์น ์์
๊ทธ๋ฆผ1์ ์ฐ๊ฒฐ๋ฆฌ์คํธ 3,8,5์์ 3๊ณผ 8์ฌ์ด์ 6์ ์ง์ด ๋ฃ์ผ๋ ค๋ฉด 3์ ํฌ์ธํฐ ์ฐธ์กฐ๊ฐ์ 8->6์ผ๋ก 6์ ์ฐธ์กฐ๊ฐ์ 8๋ก๋ง ์ค์ ํด์ฃผ๋ฉด ๋๋ค.
๋จ์ ์ผ๋ก๋ ๋ฐฐ์ด์ฒ๋ผ Index๊ฐ์ ๊ฐ์ง๊ณ ์๋ ๊ฒ์ด ์๋๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ์ ์ ๊ทผํ๋ ค๋ฉด ์ฒซ ๋ฒ์งธ ๋ฐ์ดํฐ๋ถํฐ ์ํ๋ ๋ฐ์ดํฐ๊น์ง ์์ฐจ์ ์ผ๋ก ์ฐพ์๊ฐ์ผ๋ง ํ๋ค๋ ๊ฒ์ด๋ค(8์ ์ฐพ์๊ฐ๋ ค๋ฉด ๊ฐ ๋ ธ๋์ ํฌ์ธํฐ๋ฅผ ๋ฐ๋ผ 3->6->8). ๊ฒฐ๊ณผ์ ์ผ๋ก ์ ๊ทผ ์๋๊ฐ ๋๋ฆฌ๋ค๋ ๋จ์ ์ ๊ฐ์ง๊ฒ ๋๋ค.
๋ํ ์ฐ๊ฒฐ ์ ๋ณด(ํฌ์ธํฐ)๋ฅผ ์ ์ฅํ๋ ๋ณ๋์ ์์ญ์ด ํ์ํ๊ธฐ ๋๋ฌธ์ ์ ์ฅ๊ณต๊ฐ์ ํจ์จ์ด ๋์ง ์๋ค.
head
- head: ๊ฐ์ฅ ์ฒซ ๋ ธ๋๋ฅผ ๊ฐ๋ฅดํค๋ ํ๋กํผํฐ๋ฅผ ๋ปํจ
๊ทธ๋ฆผ1์ ๊ฒฝ์ฐ 3์ด๋ data๋ฅผ ๊ฐ์ง๊ณ ์๋ ๋ ธ๋๋ฅผ head๋ผ ํ ์ ์์
Swift์์ LinkedList์ Node ๊ตฌํํ๊ธฐ
- Node
class Node<T: CalculateItem> {
private var data: T?
var next: Node<T>?
// ๋ค์ ๋
ธ๋์ ์ฐธ์กฐ๊ฐ์ ๋ด๋ ์์ญ์ด๊ธฐ๋๋ฌธ์ Node์์ฒด๋ฅผ ํ์
์ผ๋ก ๊ฐ์ง๊ณ ์๋ค.
init(data: T, next: Node?) {
self.data = data
self.next = next
}
}
extension Node: Equatable {
static func == (lhs: Node<T>, rhs: Node<T>) -> Bool {
lhs === rhs
}
}
// ์ ๋ค๋ฆญ ํ์
์ ๋ฌด์จ ํํ์ ํ์
์ด ๋์
๋ ์ง ๋ชจ๋ฅด๊ธฐ ๋๋ฌธ์ Equatable ํ๋กํ ์ฝ์ ์ฑํํ๊ณ ์์ง ์๋ค(Int, String๋ฑ์ ์ฑํํ๊ณ ์์). ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ถํ ๊ฐ์ ๋น๊ต ํ๊ณ ์ถ๋ค๋ฉด ์ฑํ์ ๋ณ๋๋ก ํด์ฃผ์ด์ผ ํ๋ค.
- LinkedList
struct LinkedList<T: CalculateItem> {
private(set) var head: Node<T>?
var isEmpty: Bool {
return head == nil
}
mutating func append(data: T) {
if head == nil {
head = Node(data: data)
return
}
var node = head
while node?.next != nil {
node = node?.next
}
node?.next = Node(data: data)
}
mutating func removeFirst() -> T? {
if head == nil {
return nil
}
let firstElement = head?.data
head = head?.next
return firstElement
}
mutating func removeAll() {
head = nil
}
//ARC์ ์ํด ์์ ์ ๊ฐ๋ฅดํค๋ ์ฐธ์กฐ๊ฐ์ด ์์ ๊ฒฝ์ฐ ๋ฐ์ดํฐ์์ญ์์ ์๋ ํด์ ๋จ, ๊ทธ๋ฌ๋ฏ๋ก head๋ง nil๋ก ๋ง๋ค์ด ์ฃผ๋ฉด ๋ชจ๋ ๊ฐ์ด ์ญ์ ๋จ
}
'๐ฅ CS > ์๋ฃ๊ตฌ์กฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์๋ฃ๊ตฌ์กฐ] ํ(QUEUE) (0) | 2022.05.17 |
---|