해결된 질문
작성
·
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을, 즉 비었다고 알려줍니다!
해당 답변이 궁금증을 해결해준 것 같나요?
무슨 내용이 이해 안 가시는지 이해했습니다!
말씀해주신 if문은 if~else로 강의에서 말하는 것처럼 두 가지 상황을 나눕니다.
if문은 첫 번째 인덱스에 삽입하는 경우이고
else문은 첫 번째 인덱스가 아닌 나머지 인덱스에 삽입하는 경우죠.
하지만 if문, 즉 첫 번째 인덱스에 삽입하는 경우도 두 가지 경우로 생각하면서 이해하셔야 합니다.
빈 연결리스트에 삽입할 때
사실 연결리스트에 데이터가 하나도 존재하지 않을 때, 즉 빈 연결리스트일 때도 if(index == 0)이 참이 됩니다.
연결리스트가 비어있을 때 데이터를 삽입하는 것은 첫 번째 인덱스에 삽입하는 것과 같습니다.
따라서 빈 연결리스트에 삽입할 때는
newNode.next = this.head; 가 어차피 null을 가리킵니다. this.head가 null이기 때문이죠. 따라서 변화가 없습니다. (이 코드는 데이터가 하나 이상일 때 삽입하는 경우 제 역할을 합니다.)
그다음으로
this.head = newNode; 로 head가 새로 삽입된 노드를 가리키는 것이죠.
한 개 이상의 데이터가 있는 리스트에서 첫 번째에 삽입할 때
이번엔 연결리스트에 한 개 이상의 데이터가 있다고 가정하겠습니다.
이때도 연결리스트의 가장 앞부분에 삽입하는 경우입니다.
index가 0, 즉 if(index == 0)이 참이 되기 때문이죠.
이때는
newNode.next = this.head; 코드는 새로 삽입된 코드가 가장 첫 번째 있는 노드를 가리킵니다. 비어있지 않은 노드이기 때문이죠. 바로 위에 빈 연결리스트에 삽입하는 경우와 차이가 생기는 부분입니다.
그렇게 새로 삽입한 노드를 가장 앞에 있는 노드 앞에 연결했다면
this.head = newNode; 로 새로 삽입한 노드를 연결리스트의 head로 만들어주는 것이지요.
강의에서는 두 번째 경우, 즉 한 개 이상의 데이터가 이미 들어있는 그림으로 설명한 것입니다.
이 설명을 보시고 if문을 비어있는 연결리스트와 데이터가 한 개 이상 들어있는 경우로 가정하고 한 번 그림을 그려가면서 코드를 따라가 보면 이해가 더 잘될 것으로 생각합니다.
그래도 어려움이 있으시다면 부담 없이 질문해주세요! 😄
답변 너무 감사드립니다 선생님!
답변을 듣고 마지막으로 질문 하나가 남았는데요,
한 개 이상의 데이터가 있는 리스트에서 첫 번째에 삽입할 때
이번엔 연결리스트에 한 개 이상의 데이터가 있다고 가정하겠습니다.
이때도 연결리스트의 가장 앞부분에 삽입하는 경우입니다.
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를 가리키는 역할을 합니다!
네 감사합니다! 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; 라고 하면 혼자 고립되버리고 끝나는거 처럼 느껴지는데 실행파일에서는 잘 결과가 나오는거 보니 제가 잘못 이해하고 있다는 생각이 듭니다. 추가 설명해주시면 너무 감사하겠습니다!
좀 깔끔한 포맷으로 질문했어야 했는데 뭔가 중구난방하게 보여 죄송합니다ㅠㅠ