LeetCode 83 - Remove Duplicates from Sorted List

[Java] Leetcode 83 - Remove Duplicates from Sorted List

Remove Duplicates from Sorted List

  • 나의 답:

    /**
     * Definition for singly-linked list.
     * public class ListNode {
     *     int val;
     *     ListNode next;
     *     ListNode() {}
     *     ListNode(int val) { this.val = val; }
     *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
     * }
     */
      
    class Solution {
      public ListNode deleteDuplicates(ListNode head) {
        if(head == null){
        return head;
        }
      ListNode prev = head;
        ListNode cur = head.next;
        while (cur != null){
          if(cur.val == prev.val){
            prev.next = cur.next;
            cur = prev;
          }
          prev = cur;
          cur = cur.next;
        }
        return head;
      }
    }
    
  • 노드의 삭제와 비슷한 문제였던 것 같다. 그림으로 설명 하자면, 다음과 같다.

    1. 아래와 같은 예시가 있다. 이는

      ListNode head 에 들어온 값이다. 1

    2. 처음에 다음과 같은 코드를 입력하여, prev값과, cur 값을 지정해주었다.

      ListNode prev = head;
      ListNode cur = head.next;
      

      이를 그림으로 표현하자면, 다음과 같다. 2

    3. 그러나 살펴보니, prev의 값 1과 cur의 값 1이 서로 같다. 위의 코드에서 반복문을 살펴보면, 서로 값이 같을 경우, 중복값을 제외하라고 나타나있다.

      if(cur.val == prev.val){ // 여기서 val이 위의 그림으로 따지면 1에 해당된다.
              prev.next = cur.next;
              cur = prev;
            }
      

      만일 값이 같을경우, prev의 다음 참조 값은, cur의 다음 참조값을 참조하라고 나타나 있다. 이를 그림으로 옮겨보면 다음과 같다.

      3

    4. 또, 다음 줄에 cur은 prev이 현재 참조하고 있는 값을 가지도록 나타나있다.

      cur = prev; 때문에, 현재 cur이 있던 위치는, prev과 같아지게 된다. 4

    5. 그 다음 줄들을 살펴보면,

      prev = cur;
      cur = cur.next;
      

      이라고 작성되어있다. 현재 cur의 참조 위치는 prev과 같으니, prev은 이동이 없고 cur은 cur의 다음 참조 변수. 즉, 이전에 지정했던 2에 해당된다. (포인터가 이미 2로 옮겨갔기 때문에!) 5

    6. prev의 값과, cur의 값은 서로 다르다. 그러니, 한 번 더 반복문이 실행되어 다음 값을 가리키게 된다.

      prev은 cur있던 자리, cur은 자신이 있던 자리가 참조하고 있는 다음 값으로! 6

    7. 6번 또한 중복값이 없으므로, 한 번 더 반복문이 실행된다. 7

    8. 이번엔 값이 중복되고 있다. 3번에서 실행되었던 조건문이 실행되어, 다음과 같이 prev의 포인터가 cur의 다음 값을 참조하게 된다. 8

      또한, 조건문을 빠져나오기 전, 4번과 같은 형태로 돌아가게 된다. 8-1

    9. 또 한번 반복문이 진행 될 경우, cur = cur.next; 는, null이 되니, 반복문은 종료가 되고 값은 저장이 되어, head를 리턴하면 위와 같은 LinkedList를 얻을 수 있다.

    • LinkedList는 참조값의 포인터들을 모두 옮겨놓은 것이기 때문에, 위의 코드에서 head를 직접적으로 언급한 것은 prev과 cur의 값을 지정한 것 뿐이지만, head자체에도 저장이 된다.

    • 또, 사실 위에서 표현하지 않았지만, 실제로 값을 살펴보면 밑으로 빠진 중복값도 아래의 그림처럼 포인터가 다음 값을 향하게 된다. 스크린샷 2021-01-13 오후 7 29 25

  • 문제를 받았을 때 바로 이해하기가 어려웠지만, 그림으로 표현해보니 좀 더 이해가 빨리 된 것 같다. 그렇지만 아직도 LinkedList는 너무너무 어렵다….

  • 결과: 스크린샷 2021-01-13 오후 6 52 18