ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Algorithm] 연결 리스트를 이용한 알고리즘 문제풀이 (Remove Duplicates)
    카테고리 없음 2020. 8. 12. 22:51

    어제 연결 리스트에 대한 포스팅을 올렸으니, 리트코드에서도 연결 리스트와 관련한 문제를 풀어보는 게 좋겠다고 생각했다. 선택한 문제는 다음과 같다.

    83. Remove Duplicates from Sorted List
    Given a sorted linked list, delete all duplicates such that each element appear only once.

     

    정렬된 연결 리스트가 주어졌을 때, 중복되는 값을 가진 요소를 삭제하여 각 요소가 한 번씩만 나오도록 하는 문제다. 예를 들어 연결 리스트의 값이 1-1-2-3으로 주어진다면 이를 1-2-3 으로 수정해주면 된다.

    어제 포스팅에서도 잠시 언급했지만, 연결 리스트의 특징은 각 노드는 다음 노드의 주소값을 가지고 있다는 것이다. 그렇다면 노드를 추가, 혹은 삭제할 때에도 다음 노드의 주소값을 변경해주면 된다. (하단 이미지 참고)

    이에 착안해서 아래와 같이 문제를 풀어보았다. 

    /**
     * Definition for singly-linked list.
     * function ListNode(val, next) {
     *     this.val = (val===undefined ? 0 : val)
     *     this.next = (next===undefined ? null : next)
     * }
     */
    
    var deleteDuplicates = function(head) {
    // 헤드가 null 이면 바로 헤드를 리턴
        if(head === null) return head;
    // 현재 검색하는 노드를 nowNode라는 변수에 담는다. 시작은 물론 헤드부터.
        let nowNode = head;
    // 다음 노드가 null일 때까지. 즉, 마지막 노드가 될 때 까지 반복문을 돌린다
        while(nowNode.next !== null){
        // 현재 노드의 값과 다음 노드의 값이 같다면, 현재 노드의 next 값을 다음 다음 노드로 변경한다
        // 그렇지 않을 경우 다음 노드로 넘어간다.
            if(nowNode.val === nowNode.next.val){
                nowNode.next = nowNode.next.next;
            } else {
               nowNode = nowNode.next;
            }
        }
        return head;
    };

     

    앞에서부터 순차적으로 노드를 훑어야 하므로 시간복잡도는 O(N)이 될 것이다.

    clear!

    댓글