작성
·
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를 여기저기서 쓰기 때문에 제일 처음에 전공과목에서 배웠을 때는 그리면서 해도 이해가 되지 않았었는데 감자님이 항상 달아주시는 그림이랑 제가 직접 종이에 그리면서 그리는 그림과 비교/대조하면서 코드를 분석하니까 코드의 순서가 중요한 경우나 노드 자체와 연결리스트를 각각 분리해서 만들었을 때 왜 코드의 재사용성이나 수정이 용이한 지 등을 고민하면서 더 깊게 이해하게 되는 것 같습니다.
도움 주셔서 정말 감사합니다!