본문 바로가기
알고리즘 문제풀이/leetcode

[leetcode 237] Delete Node in a Linked List

by m2162003 2020. 11. 27.

Write a function to delete a node in a singly-linked list. You will not be given access to the head of the list, instead you will be given access to the node to be deleted directly.

It is guaranteed that the node to be deleted is not a tail node in the list.

 

Example 1:

Input: head = [4,5,1,9], node = 5 Output: [4,1,9] Explanation: You are given the second node with value 5, the linked list should become 4 -> 1 -> 9 after calling your function.

Example 2:

Input: head = [4,5,1,9], node = 1 Output: [4,5,9] Explanation: You are given the third node with value 1, the linked list should become 4 -> 5 -> 9 after calling your function.

Example 3:

Input: head = [1,2,3,4], node = 3 Output: [1,2,4]

Example 4:

Input: head = [0,1], node = 0 Output: [1]

Example 5:

Input: head = [-3,5,-99], node = -3 Output: [5,-99]

 

Constraints:

  • The number of the nodes in the given list is in the range [2, 1000].
  • -1000 <= Node.val <= 1000
  • The value of each node in the list is unique.
  • The node to be deleted is in the list and is not a tail node

문제 풀이

무려 싫어요 수가 좋아요의 4배! 이상한 문제긴 하다..

인풋이 헤드 노드가 아닌 삭제해야 하는 노드인데다가 포인터는 next밖에 존재하지 않는다.

 

방법은 다음 노드 값을 하나씩 복붙해오는 것이다. 그리고 마지막 전 노드에서 node->next = nullptr로 설정하여 노드 개수를 하나 줄여준다. 

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    void deleteNode(ListNode* node) {
        
        ListNode* prev = node;
        while(node -> next != nullptr){
            node -> val = node -> next -> val;
            prev = node;
            node = node -> next;
        }
        prev -> next = nullptr;
        
    }
};

댓글