• 카테고리

    질문 & 답변
  • 세부 분야

    알고리즘 · 자료구조

  • 해결 여부

    해결됨

터미널에서 isEmpty: false가 나옵니다.ㅜㅜ

23.04.08 16:35 작성 조회수 306

1

 

 

답변 1

답변을 작성해보세요.

0

안녕하세요 남가형님!
보내주신 코드로 디버깅해 본 결과 DoublyLinkedList.mjs 파일 내 deleteAt() 함수에서 에러가 발견되었습니다.

결론부터 말씀드리면 deleteAt() 함수 내 95번 라인에 있는 코드는 지워주셔야 합니다!

84        if(index == 0){ //head에 있는 노드 제거
85            let deletedNode = this.head;
86            //데이터가 1개일때와 2개 이상일 떄 구분
87            if(this.head.next == null){
88               this.head = null;
89                this.tail = null;
90            }
91            else{
92                this.head = this.head.next;
93                this.head.prev = null;
94            }
95            this.head = this.head.next; // *사라져야 할 코드*
96            this.count--;
97            return deletedNode;
98       }

 

이유를 설명하자면
test 코드에서 dequeue()를 진행하면 1, 2, 3순으로 지워서 연결리스트는 비워지게 됩니다.
여기서 dequeue()를 3번 호출하면 빈 리스트이지만, this.head.next로 이미 this.head는 null인데 null객체에서 next를 호출하므로 예외가 발생합니다.
하지만 이 예외는 남가형님에게 표시되지 않아서 이유를 찾기 힘들었을거라고 생각합니다 ㅎㅎ
이 예외가 표시되지 않은 이유는
Queue.mjs파일 내 dequeue()함수에서 볼 수 있는데요.

    dequeue(){ //마지막 데이터 제거
        try{ //예외 처리
            return this.list.deleteLast();
        }catch(e){
            //console.log(e);
            return null;
        }
    }

this.list.deleteLast()함수를 호출하며 try로 예외 처리를 해주었지만
예외가 발생한 경우는 return null;을 하면서 자연스럽게 넘어갔습니다.
따라서 DoublyLinkedList.mjs파일의 deleteAt() 함수에서 count--;가 호출되지 않은 상태로 '정상적인 상태로 처리'되어 count가 1로 유지되면서 isEmpty함수가 false를 출력했습니다.
위 코드에서 제가 주석 처리한 부분(console.log(e))에서 주석을 제거 해주면 예외 메시지를 확인할 수 있을 겁니다.

궁금증이 해결되셨나요?😁