-
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/
접근 방법
- 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 } }
'알고리즘 > 알고리즘 문제풀이' 카테고리의 다른 글
Dijkstra(최단거리)_programmers_SW2018 배달 [swift] (0) 2022.05.17 Stack_프로그래머스_괄호 회전하기 [swift] (0) 2022.05.11 행렬_LeetCode_200. Number of island swift (0) 2022.02.28 카카오_프로그래머스_양궁대회 swift (0) 2022.02.28 hash,string,sort_LeetCode_49.GroupAnangram swift (0) 2022.02.21