이번에는 Linked List에서의 값을 삭제하는 방법에 대해서 알아보겠습니다.
- pop : List의 앞에 있는 값을 삭제
- removeLast : List의 제일 마지막에 있는 값을 삭제
- remove(at: ) : List의 어딘가에 있는 값을 삭제
우선 pop부터 살펴보겠습니다.
제일 앞의 요소를 pop한다면 head가 현재 head의 nextNode로 바뀌게 될 것입니다.
그리고 pop을 했을 시 비어버리는 경우도 생각해야 합니다.
마지막으로 pop을 해준 요소를 리턴해 줍니다.
코드로 나타내 보겠습니다.
@discardableResult
public mutating func pop() -> T? {
defer {
//2
head = head?.nextNode
if isEmpty {
tail = nil
}
}
//1
return head?.value
}
그림과 같은 모습을 코드로 표현하면
list.push(3)
list.push(2)
list.push(1)
print(list)
list.pop()
print(list)
이번에는 removeLast입니다.
removeLast의 경우에는 제일 뒤에있는 Node를 삭제하게 됩니다. 역시 고려해야할 상황들이 있는데요!
첫번째로 head가 없을 경우입니다.
두번째는 하나의 노드만 존재하는 경우입니다. (이경우 pop의 연산과 같음)
이 부분을 잘 고려해서 코드로 작성해보면
@discardableResult
public mutating func removeLast() -> T? {
guard let head = head else {
return nil
}
guard head.nextNode != nil else {
return pop()
}
var pre = head
var current = head
//제일 마지막 노드를 찾아가는 과정
while let next = current.nextNode {
pre = current
current = next
}
pre.nextNode = nil
tail = pre
return current.value
}
위의 그림을 코드로 나타내보면
list.push(3)
list.push(2)
list.push(1)
print(list)
list.removeLast()
print(list)
이렇게 표현될 수 있습니다!
마지막으로 remove(after: ) 연산입니다.
이전 포스팅에서 살펴보았던 insert와 비슷한 연산입니다. 삭제하고자 하는 Node를 찾은 후에 삭제를 해주면 됩니다.
이런 형식이 될 수 있겠죠!
삭제할 위치에 있는 Node를 없애주는 것은 그 위치의 Node의 연결을 끊고, 이전에 있던 Node의 nextNode를 삭제할 위치 다음에 있는 Node와 연결해 준다면 그것이 삭제가 되는 것입니다.
코드로 볼까요?!
@discardableResult
public mutating func remove(at node: JoonsNode<T>) -> T? {
defer {
if node.nextNode === tail {
tail = node
}
node.nextNode = node.nextNode?.nextNode
}
return node.nextNode?.value
}
그림과 같이 나타내려면
list.push(3)
list.push(2)
list.push(1)
print(list)
let removeNode = list.node(at: 0)!
list.remove(after: removeNode)
print(list)
이렇게 표현할 수 있습니다.
삭제 연산까지 알아봤습니다!
부족한 부분이 많지만 수정해야할 부분이나 개선해야할 사항이 있다면 글로 남겨주시면 감사하겠습니다! 🙏
'Data Structure' 카테고리의 다른 글
Linked List (with Swift) - Node and Adding Values to List (0) | 2020.12.10 |
---|---|
Stack (with Swift) (0) | 2020.12.10 |