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

top gwa님의 프로필 이미지
top gwa

작성한 질문수

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

연결리스트 - 구현

선생님 질문이있습니다.

해결된 질문

작성

·

170

1

printAll까지 구현한상태인데 insertAt에서 여기부분 반대로 했을뿐인데 왜 4에서 무한루프도는지 이해가안되네여.

currentNode의 next를 먼저정하는것이 흐름상 newNode정하고 newNode.next를 currentNode의 .next로하려고햇는데 루프도는 이유를 모르겟네여 .ㅎㅎㄷ

답변 2

2

currentnode.next = newnode
newnode.next = currentnode.next
현재 질문자님이 작성하신 코드는 이런 상황 입니다.

currentnode -> currentcode.next == newnode -> newnode.next == newnode -> newnode.next == newnode....

둘의 위치를 바꿔준다면 정상적으로 작동할 것 같습니다.
currentnode는 현재 반복문을 돌아 마지막 node이므로 currentnode.next는 null 값이 들어있을 것입니다.
newnode를 마지막에 추가하는것이 목적이라면 newnode.next = currentnode.next를 넣어주시고,
currentnode.next에 newnode를 넣어주면 정상 연결 될 것입니다.

1

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

안녕하세요 top gwa님!
currentNode.next = newNode; 를 먼저 시도해보시다가 무한루프에 빠지셨군요.

해당 코드는 newNode.next = currentNode.next; 가 먼저 오지 않으면 제대로 동작하지 않습니다.
이유는 코드 옆에 주석으로 달아보겠습니다.

for(let i = 0; i < index - 1; i++){ // 새로운 노드가 삽입될 노드를 찾습니다.
  currentNode = currentNode.next;
}

currentNode.next = newNode; // 현재 노드의 다음노드가 새로운 노드를 가리킵니다. 즉 새로운 노드를 삽입합니다.
// 여기까지는 문제가 없지만 newNode의 next를 기존 curretnNode의 next로 해줘야 하는데 위 코드로 currentNode.next의 참조가 바껴 버렸습니다...
newNode.next = currentNode.next; // 그러므로 이 코드는 다음 노드가 아닌 newNode를 가리키므로 자기 자신을 계속 참조하고, 루프에 빠지게 되는 것입니다.

 

위 순서대로 제대로 동작하게 만들고 싶으시다면

let tempNode = currentNode.next; // currentNode가 가리키는 노드를 잃어버리지 않게 저장해주고
currentNode.next = newNode; // currentNode의 next를 newNode로 바꿔서 참조를 바꿔주더라도
newNode.next = tempNode; // 이렇게 원래 가리키던 노드로 연결을 해줘야 합니다.

 

핵심은 currentNode.next를 잃어버리지 않고 newNode의 next로 잘 연결하는 것입니다.
궁금증이 해결되셨나요?

top gwa님의 프로필 이미지
top gwa
질문자

참조가 바뀌어 버렷군요 .. 감사합니다

top gwa님의 프로필 이미지
top gwa
질문자

 

top gwa님의 프로필 이미지
top gwa

작성한 질문수

질문하기