알고리즘풀이

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/