본문 바로가기

알고리즘풀이

Leetcode: Delete Node in a Linked List, 연결 리스트에서 노드 삭제하기

문제설명

단일 연결 리스트에서 노드를 삭제하는 함수를 작성하라.

리스트의 맨앞(head)에 대해 입력으로 받지 못한다. 대신, 삭제해야할 노드가 곧바로 함수 인자로 주어진다.

다만, 리스트에 가장 끝 노드(tail node)를 지우지는 않는 함수를 작성한다.

문제 풀이

이중 연결리스트가 아니므로 노드의 이전 포인터를 얻을 수 없다. 따라서, 이전 포인터와 다음 포인터를 연결하여 노드를 리스트에서 제거할 수 없다.
다음 노드의 값을 삭제할 노드에 복사하고 다음 노드의 다음 노드 값을 현재 노드의 다음 노드로 둔다.
다시 말해, 파라미터로 주어진 현재노드는 놔두고 다음 노드가 삭제되는 방식이다.

public class ListNode {
  public var val: Int
  public var next: ListNode?
  public init(_ val: Int) {
      self.val = val
      self.next = nil
  }
}

func deleteNode(_ node: ListNode?) {
    if let n = node, let next = n.next {
        n.val = next.val
        n.next = next.next
    }
}

var node1 = ListNode(1)
var node2 = ListNode(2)
var node3 = ListNode(3)
var node4 = ListNode(4)
node1.next = node2
node2.next = node3
node3.next = node4

deleteNode(node2)

print(node1.next?.val) // 3
print(node2.val) // 3
print(node3.val) // 3
print(node3.next?.val) // 4