알고리즘/알고리즘 문제풀이
LinkedList_LeetCode_19. Remove Nth Node From End of List [swift]
Downey
2022. 5. 11. 19:24
https://leetcode.com/problems/remove-nth-node-from-end-of-list/
접근 방법
- repeat - while문을 통해서, 삭제할 목표의 바로 전 ListNode를 찾는다. >> n번째 LintNode를 삭제하기 위해서는 n+1번째 노드를 찾아야 함.
- Array<ListNode> savePoints에 방문한 ListNode를 append.
- savePoints.count >= n 일 때, result = savePoints.removeFirst() >>>> 뒤에서 n번쨰 ListNode의 직전 노드. >> 뒤에서 n+1번째 노드
- 경우에 맞는 삭제 방법 실행
- 상세설명 예시, 펴서 보세요!
더보기
EX) [1,2,3,4,5] , n = 2 일 때, 편의상 savePoints내부를 .val값으로 구분. 실제로는 그렇지 않다. 객체 자체를 저장하기 때문에 에 .val이 같아도 다른 객체임.
step.1 > savePoints == [1]
step.2 > savePoints == [1,2], savePoints.removeFirst().val == 1
step.3 > savePoints == [2,3], savePoints.removeFirst().val == 2
step.4 > savePoints == [3,4], savePoints.removeFirst().val == 3, nextNode.next == nil이므로, 반복 종료.
step.5 > result.next = result.next?.next 실행
EX) [1,2] , n =1 일 때,
step.1 > savePoints == [1], savePoints.removeFist().val == 1 , nextNode.next == nil이므로, 반복 종료.
step.2 > n == 1인 것은, 가장 마지막 ListNode를 삭제하겠다는 것, 그러므로 삭제 직전 노드인 result.next = nil 실행
EX) [1,2] , n =2 일 때,
step.1 > savePoints == [1], savePoints.count > n이므로, result는 초기값이다. nextNode.next == nil이므로, 반복 종료.
result가 정해지지 않았다는 것은, 가장 처음의 ListNode를 삭제하겠다는 것. 단방향 LinkedList에서는 head의 이전 ListNode가 존재하지 않기 때문이다.
그러므로 head를 생략하기 위해, return head?.next 실행
정답 코드
더보기
/**
* Definition for singly-linked list.
* public class ListNode {
* public var val: Int
* public var next: ListNode?
* public init() { self.val = 0; self.next = nil; }
* public init(_ val: Int) { self.val = val; self.next = nil; }
* public init(_ val: Int, _ next: ListNode?) { self.val = val; self.next = next; }
* }
*/
class Solution {
func removeNthFromEnd(_ head: ListNode?, _ n: Int) -> ListNode? {
var nextNode = head
var savePoints: [ListNode] = []
var result = ListNode.init()
if head?.next == nil {
return nil
}
repeat {
guard let now = nextNode else {
return nil
}
savePoints.append(now)
if savePoints.count >= n {
result = savePoints.removeFirst()
}
if let next = nextNode?.next {
nextNode = next
}
} while nextNode?.next != nil
if n == 1 {
result.next = nil
} else if result.next == nil {
return head?.next
} else {
result.next = result.next?.next
}
return head
}
}