• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    미해결

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

24.01.24 02:13 작성 조회수 148

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

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

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

도다온님의 프로필

도다온

질문자

2024.01.24

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

0

도다온님의 프로필

도다온

질문자

2024.01.24

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

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

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

Head = null;

Tail = null;

}

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

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2024.01.24

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

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

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

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

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

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

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

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

도다온님의 프로필

도다온

질문자

2024.01.24

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

 

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