[Hackerrank 문제 풀이] Delete a Node from a Linked List

Junu Kim·2025년 11월 6일
0
post-thumbnail

[Linked List] Delete a Node from a Linked List

난이도: ★★☆☆☆ • solved on: 2025-11-06


문제 요약

  • 문제 유형: 연결 리스트(Linked List), 구현
  • 요구사항: 단일 연결 리스트에서 주어진 position(0-based index)에 위치한 노드를 삭제해야 한다.

사용 개념

  1. 자료구조

    • SinglyLinkedListNode : 단일 연결 리스트 노드 구조
      (datanext 포인터를 가짐)
  2. 알고리즘/기법

    • 순회(Traversal)
    • 포인터 재배치(pointer manipulation)
  3. 핵심 키워드

    • 노드 삭제(node removal)
    • 포인터 연결(pointer update)

풀이 아이디어

  1. 문제 분해
  • 삭제할 위치가 0이면, head.next를 반환해야 함 → 첫 노드 삭제
  • 그 외의 경우, 삭제할 노드의 직전 노드까지 이동한 뒤
    current.next = current.next.next 로 포인터를 재연결
  1. 핵심 로직 흐름

    if position == 0:
        return head.next
    else:
        current = head
        for i in 1..position-1:
            current = current.next
        current.next = current.next.next
  2. 예외 처리

    • position == 0일 때 별도 처리 필요
    • 리스트의 끝 노드를 삭제할 경우 current.next가 null일 수 있으므로 접근 주의

코드

public static SinglyLinkedListNode deleteNode(SinglyLinkedListNode llist, int position) {
    SinglyLinkedListNode current = llist;

    if (position == 0) {
        return llist.next;
    }

    int cnt = 1;

    while (cnt < position) {
        current = current.next;
        cnt++;
    }
    current.next = current.next.next;

    return llist;
}

시간·공간 복잡도

  • 시간 복잡도: O(N) — 삭제할 위치까지 순회 필요
  • 공간 복잡도: O(1) — 추가 메모리 사용 없음

어려웠던 점

  • 인덱스 0인 경우 예외 처리를 하지 않아 런타임 오류 발생
  • 연결 리스트는 값의 삭제가 아닌 포인터 재연결이라는 점을 잊지 말아야 했다

배운 점 및 팁

  • position == 0 조건은 대부분의 연결 리스트 문제에서 가장 자주 등장하는 예외 처리 포인트. -> 대표적인 Edge Case!

참고 및 링크


추가 연습 문제

  • 비슷한 유형 (GPT 추천):

    • Insert a Node at a Specific Position in a Linked List
    • Reverse a Linked List
  • 확장 문제 (GPT 추천):

    • Doubly Linked List에서의 노드 삭제 구현
    • 중간 노드를 직접 접근하여 삭제하는 알고리즘 (O(1) 삭제)
profile
생각이 현실이 될 수 있도록 노력하는 중입니다.

0개의 댓글