ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • LinkedList_LeetCode_19. Remove Nth Node From End of List [swift]
    알고리즘/알고리즘 문제풀이 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
        }
    }
Designed by Tistory.