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

Future You님의 프로필 이미지
Future You

작성한 질문수

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

연결리스트 - 구현

clear() 함수 질문

해결된 질문

작성

·

204

1

안녕하세요 선생님,

clear() 함수에서 this.head = null 이랑 this.count = 0으로 하는게 왜 리스트에 있는 기존 정보를 지우게 되는지 이해가 안되는데 추가 설명해주실 수 있을까요?

답변 1

2

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

안녕하세요 Future You님!

clear() 함수에 궁금증이 생기셨군요?

바로 답변드리겠습니다.

최초에 빈 연결리스트는 head가 null이고 count가 0입니다.

연결리스트에 데이터를 삽입하면 head가 다른 노드를 가리키고 count도 생성된 노드만큼 올라갑니다.

만약 여기서 head를 null로 바꿔주면 기존에 가리키던 노드는 더 이상 참조할 수 없게되고 자바스크립트 엔진은 참조할 수 없는 데이터(노드)는 메모리에서 제거하므로 사라지게됩니다.

메모리 관점에서도 제거됐고 연결리스트에서도 head를 null로 설정했으므로 완전히 제거됐다고 볼 수 있습니다.

그리고 연결리스트에 데이터가 전부 비워졌으니 count를 0으로 만들어서 외부에서 연결리스트의 데이터 숫자를 참조할때도 0을, 즉 비었다고 알려줍니다!

해당 답변이 궁금증을 해결해준 것 같나요?

Future You님의 프로필 이미지
Future You
질문자

네 감사합니다! clear() 함수에 관한건 답변이 되었습니다ㅎㅎ

근데 이렇게 설명을 듣고 나니 insertAt() 함수에 이해가 안되는 부분이 생기는데요...

처음에 LinkedList의 생성자가 선언될때, this.head = null이여서 아무 것도 참조할 수 없는 상태인데 그림 설명을 보면 newNode.next = this.head; 에서 this.head가 LinkedList에서 맨 앞에 있는 Node를 가르키더라고요.

newNode.next = this.head; 에서 this.head가 맨 앞 노드면 그 앞에 새로운 노드가 연결되면서 논리가 이해가 됐는데 this.head가 null인 코드만 보이고 VSCode에서도 LinkedList.head: Node | null 이라고 나와있는데 이 부분 추가 설명 들을 수 있을까요?
newNode.next가 null이면 다른 노드들이랑 연결이 안된 상태이고 거기다가 this.head = newNode; 라고 하면 혼자 고립되버리고 끝나는거 처럼 느껴지는데 실행파일에서는 잘 결과가 나오는거 보니 제가 잘못 이해하고 있다는 생각이 듭니다. 추가 설명해주시면 너무 감사하겠습니다!

좀 깔끔한 포맷으로 질문했어야 했는데 뭔가 중구난방하게 보여 죄송합니다ㅠㅠ

if(index == 0){
            newNode.next = this.head;
            this.head = newNode;
class LinkedList{
    constructor(){
        this.head = null;
        this.count = 0;
    }

    insertAt(index, data){
        if(index > this.count || index < 0){
            throw new Error("범위를 벗어났습니다.")
        }

        let newNode = new Node(data);

        if(index == 0){
            newNode.next = this.head;
            this.head = newNode;
        } else {
감자님의 프로필 이미지
감자
지식공유자

무슨 내용이 이해 안 가시는지 이해했습니다!

말씀해주신 if문은 if~else로 강의에서 말하는 것처럼 두 가지 상황을 나눕니다.
if문은 첫 번째 인덱스에 삽입하는 경우이고
else문은 첫 번째 인덱스가 아닌 나머지 인덱스에 삽입하는 경우죠.

하지만 if문, 즉 첫 번째 인덱스에 삽입하는 경우도 두 가지 경우로 생각하면서 이해하셔야 합니다.

  1. 빈 연결리스트에 삽입할 때
    사실 연결리스트에 데이터가 하나도 존재하지 않을 때, 즉 빈 연결리스트일 때도 if(index == 0)이 참이 됩니다.
    연결리스트가 비어있을 때 데이터를 삽입하는 것은 첫 번째 인덱스에 삽입하는 것과 같습니다.
    따라서 빈 연결리스트에 삽입할 때는
    newNode.next = this.head; 가 어차피 null을 가리킵니다. this.head가 null이기 때문이죠. 따라서 변화가 없습니다. (이 코드는 데이터가 하나 이상일 때 삽입하는 경우 제 역할을 합니다.)
    그다음으로
    this.head = newNode; 로 head가 새로 삽입된 노드를 가리키는 것이죠.

  2. 한 개 이상의 데이터가 있는 리스트에서 첫 번째에 삽입할 때
    이번엔 연결리스트에 한 개 이상의 데이터가 있다고 가정하겠습니다.
    이때도 연결리스트의 가장 앞부분에 삽입하는 경우입니다.
    index가 0, 즉 if(index == 0)이 참이 되기 때문이죠.
    이때는
    newNode.next = this.head; 코드는 새로 삽입된 코드가 가장 첫 번째 있는 노드를 가리킵니다. 비어있지 않은 노드이기 때문이죠. 바로 위에 빈 연결리스트에 삽입하는 경우와 차이가 생기는 부분입니다.
    그렇게 새로 삽입한 노드를 가장 앞에 있는 노드 앞에 연결했다면
    this.head = newNode; 로 새로 삽입한 노드를 연결리스트의 head로 만들어주는 것이지요.

강의에서는 두 번째 경우, 즉 한 개 이상의 데이터가 이미 들어있는 그림으로 설명한 것입니다.
이 설명을 보시고 if문을 비어있는 연결리스트와 데이터가 한 개 이상 들어있는 경우로 가정하고 한 번 그림을 그려가면서 코드를 따라가 보면 이해가 더 잘될 것으로 생각합니다.

그래도 어려움이 있으시다면 부담 없이 질문해주세요! 😄

Future You님의 프로필 이미지
Future You
질문자

답변 너무 감사드립니다 선생님!

답변을 듣고 마지막으로 질문 하나가 남았는데요,

  1. 한 개 이상의 데이터가 있는 리스트에서 첫 번째에 삽입할 때
    이번엔 연결리스트에 한 개 이상의 데이터가 있다고 가정하겠습니다.
    이때도 연결리스트의 가장 앞부분에 삽입하는 경우입니다.
    index가 0, 즉 if(index == 0)이 참이 되기 때문이죠.
    이때는
    newNode.next = this.head; 코드는 새로 삽입된 코드가 가장 첫 번째 있는 노드를 가리킵니다. 비어있지 않은 노드이기 때문이죠.

이 부분에서 newNode.next = this.head여서 첫 번째 노드보다 앞에 위치하면서 기존 첫 번째 노드와 연결되는건 이해가 가는데 this.head 가 첫번째 노드가 되는 이유는 코드에서 찾아볼 수 없는데 어느 부분에서 this.head를 첫 번째 노드라고 정해주는 것인가요? head라는 property가 리스트 중 앞에걸 지칭하는 미리 정의된 내용이 있는 건가요?

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

this.head = newNode; 이 코드가 헤드를 첫 번째로 정해주는 것입니다.
newNode.next = this.head; 로 첫 번째가 되었으니
head가 newNode를 가리키면 첫 번째 노드를 가리키는 것입니다!

head는 단순히 newNode를 가리키는 역할을 합니다!

Future You님의 프로필 이미지
Future You
질문자

아 그렇군요. 감사합니다!

Future You님의 프로필 이미지
Future You

작성한 질문수

질문하기