C 더블링크드 리스트
조회수 475회
더블 링크드 리스트에서의 노드 삭제에 대해서 궁금한 점이 있습니다.
소스코드)
void DLL_RemoveNode( Node** Head, Node* Remove )
{
if ( *Head == Remove )
{
*Head = Remove->NextNode;
if ( (*Head) != NULL )
(*Head)->PrevNode = NULL;
}
else // 삭제할 노드가 리스트의 헤드가 아닌 경우
{
Node* Temp = Remove;
if ( Remove->PrevNode != NULL )
Remove->PrevNode->NextNode = Temp->NextNode;
if (Remove->NextNode != NULL)
Remove->NextNode->PrevNode = Temp->PrevNode;
}
Remove->PrevNode = NULL;
Remove->NextNode = NULL;
}
출처) 뇌를 자극하는 알고리즘 - 더블 링크드 리스트 파트
노드 삭제의 경우 2가지로 나누어 처리합니다.
삭제할 노드가 리스트의 헤드일 경우와 아닐 경우로 나누어집니다.
첫번째로, 삭제할 노드가 리스트의 헤드일 경우입니다.
삭제할 노드(헤드)가 가리키는 다음 노드가 존재할 경우 삭제할 노드(헤드)가 가리키는 다음 노드가 가리키는 이전 노드 포인터를 NULL로 초기화시켜줍니다.
두번째로, 삭제할 노드가 리스트의 헤드가 아닌경우입니다.
삭제할 노드가 가리키는 다음 노드가 가리키는 이전 노드 포인터를 삭제할 노드가 가리키는 이전 노드를 가리켜줍니다. 그리고, 삭제할 노드가 가리키는 이전 노드가 가리키는 다음 노트 포인터를 삭제할 노드가 가리키는 다음 노드를 가리켜줍니다.
그런 후, 삭제될 노드가 가리키는 이전 노드와 다음 노드 포인터를 NULL로 초기화 시켜줍니다.
여기서 궁금한 점이 생깁니다.
2번쨰의 단계에서 삭제할 노드가 리스트의 헤드가 아닌 경우입니다. 여기서 삭제할 노드의 이전 노드의 존재성은 확보 된 거 아닌가요 ? 삭제할 노드의 다음 노드의 존재성은 확보를 못하구요.
그래서 소스코드에서도 삭제할 노드의 다음 노드의 존재성을 체크합니다.
해당 부분 소스코드) if (Remove->NextNode != NULL)
그런데 전자의 경우는 소스코드에서는 삭제할 노드의 이전 노드가 있는지 없는지(NULL 체크)를 왜 하는건가요 ? 단순히 가독성때문인가요 ?
해당 부분 소스코드)
if ( Remove->PrevNode != NULL )
그리고 1~2단계를 거친 후 삭제할 노드가 가리켰던 이전 노드, 다음 노드의 포인터를 NULL로 초기화 시켜줍니다. 왜 초기화 시켜주나여 ? 어쩌피 free로 정리해줄 건데 말이죠 ? 가독성의 문제인가요 ?
해당 부분 소스코드)
Remove->PrevNode = NULL;
Remove->NextNode = NULL;
Temp라는 임시변수도 왜 쓰는지 모르겠네요. 변수 스왑할때처럼 필요한 경우도 아닌 것 같은데 말이죠. 임시변수 없이 소스코드 고쳐도 정상 작동하더라구요.
-
(•́ ✖ •̀)
알 수 없는 사용자
댓글 입력