문제설명
- 연결 리스트의 첫 노드(head)가 주어질 때, 리스트의 끝에서부터 N번째의 노드를 제거하고 연결 리스트의 첫 노드를 반환하라.
- 가장 먼저, 리스트의 길이를 구한다.
- 리스트의 길이에서 파라미터 n을 뺀 값이 지워야할 노드의 인덱스다. (5개의 길이에서 n이 2이라면, 3번째 노드)
- 총 길이와 n이 일치하거나 더 작은 경우 첫 번째 노드를 삭제한다.
- 그렇지 않다면, 지워야할 노드의 위치 전까지 이동하여 삭제한다.
문제풀이
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; }
}
extension ListNode {
func print() -> String {
if let nextNode = next {
return "\(val) -> \(nextNode.print())"
} else {
return "\(val)"
}
}
}
func removeNthFromEnd(_ head: ListNode?, _ n: Int) -> ListNode? {
var node = head
var newHead = node
// 리스트의 길이
let length = getLength(head)
// 첫번째 노드가 지워야할 노드일 때
if length-n-1 < 0 {
node = node?.next
newHead = node
} else {
for _ in 0..<length-n-1 {
node = node?.next
}
node?.next = node?.next?.next
}
return newHead
}
func getLength(_ head: ListNode?) -> Int {
guard var n = head else {
return 0
}
var length = 1
while let nn = n.next {
length += 1
n = nn
}
return length
}
https://leetcode.com/explore/interview/card/top-interview-questions-easy/93/linked-list/603/
'알고리즘풀이' 카테고리의 다른 글
Leetcode: Merge Two Sorted Lists, 두개의 정렬된 리스트 병합 (0) | 2021.02.11 |
---|---|
Leetcode: Reverse Linked List, 연결 리스트 뒤집기 (0) | 2021.02.10 |
Leetcode: Delete Node in a Linked List, 연결 리스트에서 노드 삭제하기 (0) | 2021.02.06 |
Leetcode: Longest Common Prefix, 가장 긴 공통 접두사 (0) | 2021.02.05 |
Leetcode: strStr(), 건초더미에서 바늘찾기 (0) | 2021.02.03 |