μλ νμΈμ~
μ€λμ νμ μ΄μ΄μ μ°κ²°λ¦¬μ€νΈμ λν΄μ μ 리νλ €κ³ ν©λλ€ : )
[ Queue ν¬μ€ν ]
μ°κ²°λ¦¬μ€νΈκ° νμν μ΄μ
μ°κ²°λ¦¬μ€νΈλ₯Ό μ¬μ©νλ μ΄μ λ μ¬λ¬ κ°μ§κ° μκ² μ§λ§
λ°°μ΄κ³Ό λΉκ΅νλ©΄μ μ€λͺ ν΄λ³΄κ² μ΅λλ€.
λ°°μ΄μ μμ μ κ·Ό(Random Acess)μ΄ κ°λ₯νκΈ° λλ¬Έμ
μΈλ±μ€λ₯Ό ν΅ν΄ κ°μ λ°λ‘ μ κ·Όν μ μμ΅λλ€.
νμ§λ§ μ½μ , μμ μ κ²½μ°μλ
λ°°μ΄μ μ¬λ°°μΉν΄μΌ νλ λ‘μ§μ΄ μΆκ°λκ² λ©λλ€.
μλ₯Ό λ€μ΄ λ€μκ³Ό κ°μ λ°°μ΄μ΄ μλ€κ³ κ°μ ν΄ λ΄ μλ€.
μμ | 1 | 3 | 5 | 7 |
μΈλ±μ€ | 0 | 1 | 2 | 3 |
μ¬κΈ°μ 0λ²μ§Έ μΈλ±μ€λ₯Ό μ κ±°νκ² λλ©΄ μ΄λ»κ² λ κΉμ?
μμ | ? | 3 | 5 | 7 |
μΈλ±μ€ | 0 | 1 | 2 | 3 |
μμ κ°μ΄ 0λ²μ§Έ μΈλ±μ€μλ μλ¬΄λ° κ°λ μκ² λ©λλ€.
λ°λΌμ μ¬λ°°μΉκ³Όμ μ΄ νμνκ² λλ κ²μ΄μ£ .
μ΄λ° λΆνΈν¨μ 보μνκΈ° μν΄μ μ¬μ©νλ κ²μ΄ μ°κ²° 리μ€νΈλΌκ³ μκ°νμλ©΄ λ©λλ€.
μμ κ·Έλ¦Όμμ νλμ λ Έλκ° λ€λ₯Έ λ Έλλ₯Ό κ°λ¦¬ν€κ³ μλ κ² λ³΄μ΄μ€ κ²λλ€.
κ·Έλ¦¬κ³ λ§μ§λ§ λ Έλλ λ€μ λ Έλκ° μκΈ°μ nliλ‘ μ²λ¦¬νκ² λ©λλ€.
μ΄λ₯Ό λ¨λ°©ν₯μΌλ‘ μ°κ²°λ 리μ€νΈλΌκ³ ν©λλ€.
λ Έλ(node)λ 리μ€νΈμμ λ°μ΄ν°λ₯Ό μ μ₯νλ λ¨μλ‘ λ°μ΄ν°μ μ΄μ , μ΄ν νΉμ λ λ°©ν₯μ λ Έλλ₯Ό κ°λ¦¬ν€λ ν¬μΈν°λ‘ μ΄λ£¨μ΄μ§ κ°μ²΄μ λλ€.
μ¬κΈ°μ Aλ°μ΄ν°λ₯Ό μ κ±°νλ€κ³ νλ©΄
λ°λ‘ Head ν¬μΈν°λ§ Bλ‘ λ겨주면 λ©λλ€.
λ¬Όλ‘ Aλ Έλλ λ©λͺ¨λ¦¬ν΄μ λ₯Ό ν΄μ£Όμ΄μΌ νκ³ μ.
μ¬λ°°μΉκ° νμνμ§ μμΌλ
λ°°μ΄λ³΄λ€λ μ½μ νκ±°λ μμ ν λ μκ°λ³΅μ‘λ μΈ‘λ©΄μμ μ΄λμ μ·¨ν μ μκ² λλ κ²μ λλ€.
λ Έλμ μλ°©ν₯ μ°κ²° 리μ€νΈ ꡬν
- μμμ λ¨λ°©ν₯ μ°κ²°λ¦¬μ€νΈλ₯Ό μκ°νλλ° μλ°©ν₯ 리μ€νΈμ κ²½μ°μλ λ€μμ΄ μλ μ΄μ μ κ°λ¦¬ν€λ λ Έλλ μ‘΄μ¬ν©λλ€. μ΄λ¦ κ·Έλλ‘ μ, λ€ μμͺ½ λ°©ν₯ λͺ¨λλ₯Ό μ μ μκ² λλ κ²μ λλ€..
1. λ Έλ(Node)
// λ
Έλ
class Node<T> {
// λ
Έλμλ λ°μ΄ν°μ μ, λ€λ₯Ό κ°λ₯΄ν€λ λ
Έλκ° μ‘΄μ¬!
var prev: Node?
var data: T?
var next: Node?
init(data: T?, prev: Node? = nil, next: Node? = nil) {
self.prev = prev
self.data = data
self.next = next
}
}
- μλ°©ν₯ μ°κ²°λ¦¬μ€νΈμμμ λ Έλλ μμ κ°μ΄ μ΄μ κ³Ό μ΄νλ₯Ό κ°λ₯΄ν€λ prev, next κ° μ‘΄μ¬ν©λλ€.
2. μλ°©ν₯ μ°κ²° 리μ€νΈ(Linked List)
- μ°κ²°λ¦¬μ€νΈλ λ©λͺ¨λ¦¬ 곡κ°μμ λ°μ΄ν°λ€μ μ°κ²°ν΄ μ£Όλ μλ£κ΅¬μ‘°μ΄κΈ° λλ¬Έμ μλ°©ν₯ μ°κ²°λ¦¬μ€νΈμμλ κ°μ₯ μμ λ Έλλ₯Ό κ°λ₯΄ν€λ headμ κ°μ₯ λ€μ λ Έλλ₯Ό κ°λ₯΄ν€λ tail λ Έλκ° μμ΄μΌν©λλ€. μ΄λ μμ μ κ·Όμ΄ κ°λ₯νλ λ°°μ΄κ³Ό λ€λ₯΄κ² μμ°¨ μ κ·Όμ ν΄μΌνλ μ΄μ μ΄κΈ°λ ν©λλ€.
λ°λΌμ λ€μκ³Ό κ°μ΄ λ§λ€ μ μμ΅λλ€.
// μ°κ²° 리μ€νΈ
class LinkedList<T> {
// μ°κ²°λ¦¬μ€νΈμ 첫λ²μ§Έ λ
Έλλ₯Ό κ°λ₯΄ν€λ head νλ‘νΌν°
var head: Node<T>?
// μ°κ²°λ¦¬μ€νΈμ λ§μ§λ§ λ
Έλλ₯Ό κ°λ₯΄ν€λ tail νλ‘νΌν°
var tail: Node<T>?
init(head: Node<T>? = nil, tail: Node<T>? = nil) {
self.head = head
self.tail = tail
}
}
λ°μ΄ν°λ₯Ό μΆκ°νκ³ μμ νκ³ νμνλ λ°©λ²κΉμ§ μμλ΄ μλ€.
3. μ°κ²° 리μ€νΈμ ν¬κΈ°, νμ, μ½μ , μμ
3.1 ν¬κΈ°
- μ°κ²° 리μ€νΈμ ν¬κΈ° μ¦, λ°μ΄ν°μ κ°μλ₯Ό ꡬνλ λ©μλμ λλ€.
- λ§μ§λ§ λ Έλμ κ²½μ° λ€μ λ°μ΄ν°λ₯Ό κ°λ₯΄ν€λ λ Έλκ° μμΌλ―λ‘ nilμΈ μ μ μ΄μ©ν΄ μ¬μ΄μ¦λ₯Ό νμΈν μ μμ΅λλ€.
func size() -> Int {
// λ
Έλκ° μ‘΄μ¬νλμ§!
guard var node = self.head else {
return 0
}
var count = 0
// λ§μ§λ§ λ
Έλλ nilμ κ°μ§κ³ μλ κ²μ νμ©ν΄
// νμ λ° κ°μλ₯Ό μΉ΄μ΄νΈ ν©λλ€!
while node.next != nil {
count += 1
node = node.next!
}
return count
}
3.2 νμ
- μ°κ²° 리μ€νΈμ ν¬κΈ°λ₯Ό ꡬνλ©΄μ μ΄κ±Έ μ΄μ©νλ©΄ νΉμ ν μμμ λ Έλλ₯Ό νμΈν μ μκ² λ€κ³ μκ°νμ μ μμ΅λλ€. κ·Έ μ μ μ΄μ©ν΄μ λ€μκ³Ό κ°μ΄ νμΈν μ μμ΅λλ€.
func findNode(at index: Int) -> Node<T>? {
guard var node = self.head else {
return nil
}
// indexμ ν΄λΉνλ κ°κΉμ§ λ°λ³΅ν΄μ λ€μ λ
Έλλ‘ νμ
for _ in 1...index {
guard let nextNode = node.next else {
return nil
}
node = nextNode
}
return node
}
- λ°λλ‘ νΉμ ν κ°μ κ°μ§κ³ μλ λ Έλλ μ°Ύμλ³Ό μ μμ΅λλ€.
func firstIndex(of data: T) -> Int? {
guard var node = self.head else {
return nil
}
var count = 0
while true {
// νΉμ ν λ°μ΄ν°μ κ°μ κ°μ§κ³ μλ λ
Έλκ°
// λͺλ²μ§Έμ μλμ§ νμΈ ν λ°ν!
if node.data == data {
return count
}
guard let next = node.next else {
return nil
}
node = next
count += 1
}
}
μ€μ : μμμ node.data = dataμμ μ€λ₯κ° λ°μν©λλ€. λ°λ‘ μ λ€λ¦μ κ²½μ° "==" μ°μ°μλ₯Ό μ¬μ©ν μ μκΈ° λλ¬ΈμΈλ° κΈ°μ‘΄μ LinkedList ν΄λμ€μμ LinkedList <T: Equatable>λ‘ λ°κΎΈμ΄μΌ μ¬μ©ν μ μκ² λ©λλ€.
3.3 μΆκ°
- μλ‘κ² μμ±λ λ Έλμ μνλ μμΉλ₯Ό μ λ ₯λ°κ³ μμ λ Έλμ λ€μ λ Έλμ μ 무λ₯Ό νλ³ν λ€μ μ°κ²°ν΄μ£Όλ λ©μλμ λλ€. μμΈν λ΄μ©μ μ£Όμμ ν΅ν΄ μ λ ₯ν΄ λμμ΅λλ€.
func insert(_ newNode: Node<T>, at index: Int) {
// headκ° nilμ΄λΌλ©΄ μμ§ μ무κ²λ μλ€λ κ±°κ² μ£ ?
// λ°λΌμ headμ tailμ μλ‘μ΄ λ
Έλ(newNode)λ₯Ό μ μ₯ν΄ μ£Όλ©΄ λ©λλ€!
if self.head == nil {
self.head = newNode
self.tail = newNode
return
}
// λ§μ½μ μμ λ
Έλλ₯Ό μ°Ύμ μ μλ€λ©΄ μ¦, κΈ°μ‘΄μ μ°κ²° 리μ€νΈμ κΈΈμ΄λ³΄λ€ κΈ΄
// μΈλ±μ€ κ°μ΄ λ€μ΄μ€κ² λ κ² μ΄κΈ° λλ¬Έμ
// λΆκΈ°μ²λ¦¬νκ±°λ κ°μ₯ λ€μ λΆμ¬μ£Όλ©΄ λ©λλ€μ / μ¬κΈ°μλ κ°μ₯ λ€μ λΆμ¬μ€¬μ΅λλΉ
guard let prevNode = findNode(at: index-1) else {
self.tail?.next = newNode
self.tail = newNode
return
}
guard let nextNode = prevNode.next else {
// prevNode λ€μμ΄ nilμ΄λΌλ©΄ tailμ΄λκΈ° λλ¬Έμ λ°λ‘ λ€μμΌλ‘ μ°κ²°!
prevNode.next = newNode
self.tail = newNode
return
}
/*
μμ κ³Όμ μ λͺ¨λ κ±°μ³€λ€λ©΄
newNodeμ λ€μμ nextNodeκ° λκ³
prevNode(νλ μ΄μ )μ λ€μμ newNodeκ° λλ€.
prevNode -> nextNode μλ μ°κ²°λ¦¬μ€νΈμμ ν΄λΉ μΈλ±μ€μ λ€μ΄μ€λ
μ΄ λ λ
Έλ μ¬μ΄μκ³
μ¦, prevNode -> newNode -> nextNodeκ° λλ κ²!
*/
newNode.next = nextNode
prevNode.next = newNode
}
3.4 μμ
- μ½μ κ³Ό κ³Όμ μ΄ λΉμ·ν©λλ€. μ΄μ μ λ Έλλ₯Ό μ°Ύκ³ μμνμλ©΄ λ©λλ€.
func remove(at index: Int) {
// prevNodeκ° μλ€λ©΄? μ¦, μ΄μ μ λ
Έλκ° μ‘΄μ¬νμ§ μλ λ€λ λ§!
// λ°λΌμ ν κ² μμ΅λλΉ..
guard let prevNode = findNode(at: index-1) else {
return
}
// prevNodeκ° λ§μ§λ§ λ
ΈλλΌλ©΄ μμ λ§μ°¬κ°μ§κ² μ£ !
// ν κ² μμ΅λλΉ..
guard let removeNode = prevNode.next else {
return
}
// index μμΉμ λ
Έλ(removeNode)κ° λ§μ§λ§ λ
ΈλλΌλ©΄?
// μ΄μ μ λ
Έλκ° κ°λ₯΄ν¬ κ²μ μμΌλ nil
// tailμ κ²½μ°μλ μ΄μ μ λ
Έλλ₯Ό κ°λ₯΄ν€κ³ μμ΄μΌκ² μ₯¬!
guard let nextNode = removeNode.next else {
prevNode.next = nil
self.tail = prevNode
return
}
// index μμΉμ λ
Έλ(removeNode)κ° λ§μ§λ§ λ
Έλκ° μλλΌλ©΄?
// λΉμ°ν μ΄μ μ λ
Έλ λ€μλ
Έλκ° μ κ±°λ λ
Έλμ λ€μ λ
Έλλ₯Ό κ°λ₯΄ν€λ!!
// μ¦, prevtNode -> removeNode -> nextNode μνμμ
// removeNodeκ° μ κ±° λκ² νλ €λ©΄
// prevNode.next = nextNodeκ° λμΌνλ κ²!
prevNode.next = nextNode
}
λ€μ ν¬μ€ν μ ν΄μ ν μ΄λΈμ λλ€.
κ·ΈλΌ μ΄λ§ ππ» ππ» ππ»
μ°Έκ³ ν λ§ν¬λ€μ λλ€.
κ°μν©λλ€ π
'μλ£κ΅¬μ‘°' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Swift] μλ£κ΅¬μ‘° - ν(Heap) (0) | 2023.01.30 |
---|---|
[Swift] μλ£κ΅¬μ‘° - μ΄μ§ νμνΈλ¦¬ ( Binary Search Tree ) (0) | 2022.05.14 |
[Swift] μλ£κ΅¬μ‘° - ν΄μ ν μ΄λΈ(Hash Table) (0) | 2022.04.21 |
[Swift] μλ£κ΅¬μ‘° - ν(Queue) (0) | 2022.04.19 |
[Swift] μλ£κ΅¬μ‘° - μ€ν(Stack) (0) | 2022.04.18 |