2024년 5월 5일 (일)
Leetcode daily problem
https://leetcode.com/problems/delete-node-in-a-linked-list/?envType=daily-question&envId=2024-05-05
단일 연결 리스트(head)가 있고 그 안에 있는 노드(node)를 삭제하려고 한다. 삭제할 노드가 제공되는데, head의 첫 번째 노드에 대한 접근을 하지 않는다. (접근 권한이 제공되지 않는다.)
연결리스트의 모든 값은 고유하며, 주어진 노드가 연결리스트의 마지막 노드가 아니라는 것이 보장될 때, 해당 노드를 삭제한다.
여기서 노드를 삭제한다고 해서 메모리에서 제거되는 것은 아니며, 아래와 같은 의미를 가진다.
custom testing:
linked list (연결 리스트)
연결 리스트에서 특정 노드를 삭제하는 문제이다.
주어진 연결 리스트에서 삭제할 노드가 주어지고, 해당 노드를 삭제한 후에 남은 리스트를 반환하는 것이 아니고, 삭제할 노드 자체만 제거하는 것이다.
즉, 삭제할 노드만 주어지기 때문에 삭제할 노드의 값을 다음 노드의 값으로 바꾸고 다음 노드를 삭제하는 것이다.
다음 노드를 현재 노드로 복사하고, 다음 노드를 건너뛰어 다음 다음 노드를 현재 노드로 설정하여 삭제한다.
연결 리스트의 끝에 있는 노드를 삭제하는 경우나, 삭제할 노드가 없는 경우 등의 예외케이스도 고려해야하지만 문제에 연결 리스트 끝에 있는 노드가 아님이 보장되어 있으므로 관련 로직은 넣지 않아도 된다.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def deleteNode(self, node):
"""
:type node: ListNode
:rtype: void Do not return anything, modify node in-place instead.
"""
node.val = node.next.val
node.next = node.next.next
시간 복잡도
노드를 삭제하는 과정은 상수 시간에 이루어진다.
삭제할 노드의 값을 다음 노드의 값으로 교체하고, 다음 노드를 현재 노드의 다음 노드로 설정하는 연산이다. 즉, 삭제 하는 과정의 시간복잡도는 O(1)이다.
공간 복잡도
주어진 연결 리스트에서 추가적인 공간을 사용하지 않고 주어진 노드의 값을 수정하는 것으로 해결되므로 공간복잡도는 O(1)이다.