[2024] day 127. Leetcode 237. Delete Node in a Linked List

gunny·2024년 5월 6일
0

코딩테스트

목록 보기
440/530

2024년부터 새롭게 다시 시작하는 코딩테스트

2024년 5월 5일 (일)
Leetcode daily problem

237. Delete Node in a Linked List

https://leetcode.com/problems/delete-node-in-a-linked-list/?envType=daily-question&envId=2024-05-05

Problem

단일 연결 리스트(head)가 있고 그 안에 있는 노드(node)를 삭제하려고 한다. 삭제할 노드가 제공되는데, head의 첫 번째 노드에 대한 접근을 하지 않는다. (접근 권한이 제공되지 않는다.)

연결리스트의 모든 값은 고유하며, 주어진 노드가 연결리스트의 마지막 노드가 아니라는 것이 보장될 때, 해당 노드를 삭제한다.

여기서 노드를 삭제한다고 해서 메모리에서 제거되는 것은 아니며, 아래와 같은 의미를 가진다.

  • 해당 노드의 값은 연결리스트에 존재하지 않아야 함
  • 연결된 목록의 노드 수는 1씩 감소해야 함
  • 노드 이전의 모든 값은 동일한 순서로 되어 있어야 함
  • 노드 뒤의 모든 값은 동일한 순서로 되어 있어야 함

custom testing:

  • 입력의 경우 전체 연결리스트 헤드와 노드를 제공할 노드를 제공해야 해야 한다.
  • 노드는 목록의 마지막 노드가 아니어야 하며 목록의 실제 노드여야 한다.
  • 연결된 목록을 작성하고 노드를 함수에 전달한다.
  • 출력은 함수를 호출한 후 전체 리스트가 된다.

Solution

linked list (연결 리스트)

연결 리스트에서 특정 노드를 삭제하는 문제이다.
주어진 연결 리스트에서 삭제할 노드가 주어지고, 해당 노드를 삭제한 후에 남은 리스트를 반환하는 것이 아니고, 삭제할 노드 자체만 제거하는 것이다.

즉, 삭제할 노드만 주어지기 때문에 삭제할 노드의 값을 다음 노드의 값으로 바꾸고 다음 노드를 삭제하는 것이다.
다음 노드를 현재 노드로 복사하고, 다음 노드를 건너뛰어 다음 다음 노드를 현재 노드로 설정하여 삭제한다.

연결 리스트의 끝에 있는 노드를 삭제하는 경우나, 삭제할 노드가 없는 경우 등의 예외케이스도 고려해야하지만 문제에 연결 리스트 끝에 있는 노드가 아님이 보장되어 있으므로 관련 로직은 넣지 않아도 된다.

Code

# 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         

Complexicity

시간 복잡도

노드를 삭제하는 과정은 상수 시간에 이루어진다.
삭제할 노드의 값을 다음 노드의 값으로 교체하고, 다음 노드를 현재 노드의 다음 노드로 설정하는 연산이다. 즉, 삭제 하는 과정의 시간복잡도는 O(1)이다.

공간 복잡도

주어진 연결 리스트에서 추가적인 공간을 사용하지 않고 주어진 노드의 값을 수정하는 것으로 해결되므로 공간복잡도는 O(1)이다.

profile
꿈꾸는 것도 개발처럼 깊게

0개의 댓글