알고리즘풀이
Leetcode: Remove Nth Node From End of List, 연결 리스트의 끝부터 N번째 노드 삭제하기
batterflyyin
2021. 2. 7. 14:34
문제설명
- 연결 리스트의 첫 노드(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/