강의

멘토링

로드맵

Inflearn brand logo image

인프런 커뮤니티 질문&답변

이지민님의 프로필 이미지
이지민

작성한 질문수

그림으로 쉽게 배우는 자료구조와 알고리즘 (기본편)

큐 - 구현

tail을 삭제하는 경우에 관련해서 질문이 있습니다.

작성

·

73

0

안녕하세요 감자님. 큐 구현 강의 중 tail 부분을 삭제하는 코드에 관련해서 질문이 있어서 글을 남기게 되었습니다.

else if (index == this.count - 1) {
        let deleteNode = this.tail; // 삭제할 노드
        this.tail = this.tail.prev; // 기존 tail의 이전 노드를 새로운 tail로 설정
        this.tail.next = null; // 새로운 tail의 다음 노드를 null로 설정
        
        this.count--; // 노드 개수 감소
        return deleteNode; // 삭제된 노드 반환
    }

 

else if (index == this.count - 1) {
        let deleteNode = this.tail; // 삭제할 노드

        this.tail.prev.next = null; // 기존 tail의 이전 노드의 다음 노드를 null로 설정
        this.tail = this.tail.prev; // 기존 tail의 이전 노드를 새로운 tail로 설정
        
        this.count--; // 노드 개수 감소
        return deleteNode; // 삭제된 노드 반환
    }

위의 코드가 제가 그림을 그려가면서 생각한 로직이고 아래의 코드가 감자님이 강의에서 올려주신 코드입니다.

얼핏 생각하고 그림으로 대조해봤을 때 똑같은 기능을 하는 코드들인데 어떤 차이가 있는지 chatGPT한테 물어봤습니다.

아래의 코드의 경우는 연결리스트에 노드가 1개 존재할 때 this.tail.prev가 null이기 때문에 error가 발생할 가능성이 있다고 했었습니다. 근데 강의에서 제공된 풀 코드를 보면 이미 연결리스트에 노드가 1개인 부분은 위의 if문에서 처리되기 때문에 문제가 없는 것 같습니다.

둘 중에 어떤 코드를 쓰는 게 더 정확할지 여쭙고 싶어 질문 남깁니다. 감사합니다.

 

답변 1

0

감자님의 프로필 이미지
감자
지식공유자

안녕하세요 이지민님!
두 코드를 비교해보면 대체되는 tail을 먼저 지정할지, tail의 이전 노드의 next를 null로 할지의 순서 차이가 있네요.
이 두 순서가 바뀌더라도 결과에는 차이가 없습니다.
말씀하신 것처럼 노드가 1개인 경우는 따로 처리되기 때문입니다.

다만 코드를 보니 지민님이 작성하신 코드가 참조를 더 적게 하여 코드를 읽는 사람 입장에서 이해하기가 더 쉬울 것 같습니다.
실질적인 차이는 미미하겠지만, 참조 횟수가 1회 적어 메모리 접근 시간도 더 짧습니다.
따라서 지민님이 작성하신 코드를 사용하는 것이 더 좋아 보입니다.

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

이지민님의 프로필 이미지
이지민
질문자

특히 연결리스트 구현 부분은 prev,current,next를 여기저기서 쓰기 때문에 제일 처음에 전공과목에서 배웠을 때는 그리면서 해도 이해가 되지 않았었는데 감자님이 항상 달아주시는 그림이랑 제가 직접 종이에 그리면서 그리는 그림과 비교/대조하면서 코드를 분석하니까 코드의 순서가 중요한 경우나 노드 자체와 연결리스트를 각각 분리해서 만들었을 때 왜 코드의 재사용성이나 수정이 용이한 지 등을 고민하면서 더 깊게 이해하게 되는 것 같습니다.

도움 주셔서 정말 감사합니다!

이지민님의 프로필 이미지
이지민

작성한 질문수

질문하기