알고리즘/알고리즘 문제풀이

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/

 

접근 방법

  1. repeat - while문을 통해서, 삭제할 목표의 바로 전 ListNode를 찾는다. >> n번째 LintNode를 삭제하기 위해서는 n+1번째 노드를 찾아야 함.
  2. Array<ListNode> savePoints에 방문한 ListNode를 append.
  3. savePoints.count >= n 일 때, result = savePoints.removeFirst() >>>> 뒤에서 n번쨰 ListNode의 직전 노드. >> 뒤에서 n+1번째 노드
  4. 경우에 맞는 삭제 방법 실행
    • 상세설명 예시, 펴서 보세요!
더보기

 

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
    }
}