인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

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

도다온님의 프로필 이미지
도다온

작성한 질문수

[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part2: 자료구조와 알고리즘

연결 리스트 구현 연습

연결리스트 Remove 관련 질문입니다.

작성

·

257

0

public void Remove(Room<T> room) {

if (room == Head) {

Head = Head.Next;

Head.Prev = null;

}

else if (room == Tail) {

Tail = Tail.Prev;

Tail.Next = null;

}

else {

room.Prev.Next = room.Next;

room.Next.Prev = room.Prev;

}

Count--;

}

 

제가 구현한 Remove는 이렇습니다.

강의에서 room.Prev 와 room.Next 의 null 유무를 체크하던데, 여기서 이해가 안 되어 질문드립니다.

 

1, 2, 3, 4, 5의 경우라고 가정해보면

1은 head, 5는 tail, 이를 삭제하려고 할 경우 앞의 두 조건문에서 걸립니다.

나머지의 2, 3, 4 를 가정해보면 이 노드들은 필히 Next 와 Prev가 존재합니다. AddLast를 보더라도 Tail의 next와 newRoom의 Prev를 서로 연결하는 부분이 존재하니 말이죠. 그러니 이를 굳이 조건절에서 검증해야 할 필요가 있나?가 궁금합니다.

 

또 head, tail 조건에서도 Head.Prev = null, Tail.Next = null 을 하지 않으면 remove의 조건을 정확히 충족하지 못한다고 생각합니다. 어찌됐든 접근할 수 없도록 만드는 게 이론적으로 삭제와도 같으니깐요. null 처리를 안 할 경우 만약 Head.Prev를 하게 되면 삭제했던 노드를 다시 호출할 수 있게 된다고 봅니다.

답변 3

0

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

말씀하신 null 처리는 room.Prev.Next = room.Next; 로 간접적으로 처리 됩니다.
왜냐하면 room.Next가 null이면 (즉 마지막 방이라면) 알아서 null로 밀어주기 때문이죠.

코드는 다양한 방법으로 구현할 수 있고 정답이 있는 개념이 아닙니다.
따라서 말씀하신 것처럼 각 상황으로 if else로 구분해도 당연히 됩니다.

도다온님의 프로필 이미지
도다온
질문자

이해 했습니다. 자세한 답변 감사드립니다!

0

도다온님의 프로필 이미지
도다온
질문자

추가적으로 값이 1개일 경우

처음 조건을 else if로 변환한 후

if (room == Head && room == Tail) {

Head = null;

Tail = null;

}

이와 같은 코드도 추가하였습니다. 이렇게 해도 질문에는 큰 변함이 없습니다.

0

안녕하세요, 인프런 AI 인턴입니다.

도다온님, 연결 리스트의 Remove 메서드 구현과 관련하여 PrevNextnull인 경우에 대한 검증의 필요성에 대해 질문하셨습니다.

해당 질문과 유사한 내용을 담고 있는 기존의 질문&답변을 찾았습니다. 강의 중 해당 부분에서 조건 검사가 왜 필요한지에 대한 설명이 포함되어 있으니 참고하시면 좋을 것 같습니다.

  • 연결리스트 구현에서는 room.Prevroom.Nextnull일 수 있는 여러 경우에 대해 검증하는 이유를 설명하고, HeadTail의 변경과 관련된 처리 방법에 대해서도 논의하고 있습니다.

질문자님의 경우에도 Head.NextTail.Prevnull로 설정하신 것처럼, 리스트의 양 끝 노드를 삭제할 때 특정 필드를 null로 설정해야 하는 이유에 대해 질문하고 있습니다. 강의에서는 연결리스트가 상황에 따라 일관되게 동작하도록 만드는 것이 중요하다고 강조하고 있습니다. null 체크는 양 끝 노드에 한해서뿐만 아니라 리스트의 일관성을 위해 필요한 조치입니다.

위의 링크를 통해 보다 자세한 설명을 확인해보시고, 제시된 예시 코드와 비교하여 다양한 사례에서 Remove 메서드가 어떻게 동작해야 하는지 이해하는데 도움이 될 것입니다.

모호한 부분이 있거나 추가적으로 궁금한 점이 있으시다면 해당 강의의 Q&A 섹션을 통해 지식공유자께 질문을 하여 보다 자세하고 명확한 답변을 얻으실 수 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

도다온님의 프로필 이미지
도다온
질문자

질문자님의 경우에도 Head.NextTail.Prevnull로 설정하신 것처럼, 리스트의 양 끝 노드를 삭제할 때 특정 필드를 null로 설정해야 하는 이유에 대해 질문하고 있습니다.

 

무슨 말인지 모르겠네요 이건. 질문하고 있는 게 아니라 당연하게 특정 필드를 null로 해야하지 않나, 강의 코드에는 이게 없다 왜 그렇나를 질문한 겁니다.

도다온님의 프로필 이미지
도다온

작성한 질문수

질문하기