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

류지혜님의 프로필 이미지
류지혜

작성한 질문수

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

연결리스트 - 구현

deleteAt(index) 함수 질문이 있습니다

작성

·

321

1

선생님 안녕하세요!! deleteAt(index)함수 공부하다가 질문이 있습니다. index==0일 경우 보면 head의 값만 변경하고 첫번째 삭제할 노드의 next값은 계속 두번째 노드값을 가르키고 있는데,,제 생각에는 첫번째 노드값의 next를 null로 만들어줘야 한다고 생각하는데 선생님의 의견이 궁금합니다~

답변 2

1

류지혜님의 프로필 이미지
류지혜
질문자

쪼꼼 이해가 안가는 부분이 있는데요 ㅠ 그럼 두번째 노드를 참조하는 head와 두번째 노드를 참조하는 첫번째 노드 이렇게 공존을 하는걸까요? 아님 head가 두번째 노드를 참조하면서 첫번째 노드는 두번째노드와의 참조가 끊기는 건가요??

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

head는 첫 번째 노드를 참조하고 있다가 두 번째 노드를 참조하게 됩니다! 공존하는 상황은 절대 없습니다!
그리고 첫 번째 노드의 next로 두 번째 노드를 참조하고 있는 것은 달라지지 않습니다.

다만 우리는 연결리스트를 head를 기준으로 오른쪽으로 참조하기 때문에 첫 번째 노드는 참조할 수 없게 됩니다. 따라서 연결리스트에선 첫 번째 노드를 참조할 수 없게 되는 것이죠 ㅎㅎ
첫 번째 노드가 메모리에서 사라지기 전까지는 첫 번째 노드의 next는 두 번째 노드를 가리키고 있으므로 실제로 연결을 제거하지는 않지만 head로 참조는 불가능하기 때문에 연결이 끊어진 것과 같은 효과를 내는 것입니다!

메모리에서 객체가 가리키는 그림보다는 head 기준으로 참조가 가능한지를 생각하시면 이해가 더 쉬울 것 같습니다 ㅎㅎ

 

0

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

안녕하세요 류지혜님!
head를 제거하는 상황에서 head노드의 next가 계속 연결되어있어서 조금 혼란이 오신 것 같네요 ㅎㅎ

말씀해주신 대로 head가 기존 head(첫 번째 노드)의 next를 가리키기 전에 head의 next를 null로 만들어주면 연결이 끊어지게 됩니다.
하지만 저는 이 과정을 생략했습니다.
그 이유는 head가 기존 head(첫 번째 노드)의 next를 가리키기 때문에 연결리스트에서 기존 head(첫 번째 노드)를 참조할 수 없게 됩니다.
따라서 실제로 연결을 끊지 않아도 우리의 연결리스트에선 논리적으로 연결이 끊어진 것처럼 되죠.

그럼 영원히 기존 head(첫 번째 노드)는 메모리에 남아있을 수도 있는 걱정을 하실 텐데 이 부분은 걱정하지 않으셔도 됩니다.
자바스크립트는 어떤 객체에 참조할 방법이 없다면 가비지 컬렉터가 메모리에서 제거해줍니다.
따라서 deleteAt() 함수를 호출한 결과를 따로 변수에 저장하지 않거나 그 변수를 다른 값으로 덮어쓴다면 삭제된 노드(첫 번째 노드)를 참조할 수 없게 되고 가비지 컬렉터가 적절한 시점에 메모리에서 제거해주기 때문에 실질적인 연결도 끊어지게 됩니다.

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

저도 이 부분이 궁금해서 글을 보게 되었는데요. 현재 강의에서는 index = 0일때
deleteNode변수가 지워질 첫번째 노드를 참조하고 있잖아요? 이건 강의때문에 let deleteNode = this.head를 하지않고 바로 this.head = this.haed.next를 하면되는데 삭제한 노드를 보여주기 위함인건가요?
위의 글에서 메모리의 노드(데이터)를 참조하지 않으면 가비지컬렉터가 알아서 지운다고 이해했습니다. 문제는 deleteNode변수가 현재 지워질 첫번째노드를 참조하고 있는것같은데 그럼 첫번째 노드는 가비지컬렉터에 의해서 안지워지는거 아닌가요??

deleteNode = this.head 만 없다면 모든게 이해가 가는것같은데.. 혹시 잘못이해한걸까요??

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

deleteAt함수 호출 이후 해당 연결리스트로 삭제된 값에 접근이 불가합니다. 연결리스트에서 완전히 제거 됐기 때문이죠.

삭제된 값을 함수의 리턴값으로 사용해 메모리에 임시로 살려두는 이유는 삭제된 값을 참조해 다른 작업을 할 수 있도록 유연성을 위해 만들어 놓은 것입니다.

만약 삭제된 값을 앞으로도 사용할 계획이 없다면 리턴하지 않아도 무관합니다.

삭제된 값을 리턴하든 리턴하지 않든 연결리스트에선 완전히 제거 되는 건 같으므로 혼동하지 않으셔도 됩니다 :)

감사합니다. 연결리스트 자체가 접근 못하는건 이해했었는데

메모리관점에서 혹시나 남아 있는게 아닐까 하는 의문이 들어서 혼동했습니다 ㅎㅎ
이건 여담인데 감자님 강의가 너무좋아서 그러는데 혹시 지금 또 준비하고 계신 강의가 있으실까요?

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

그러시군요 ㅎㅎ

아직 준비중인 강의는 없습니다ㅠ

추후 강의를 제작하면 새소식으로 전달드리겠습니다!!

감사합니다 :)

류지혜님의 프로필 이미지
류지혜

작성한 질문수

질문하기