Если в списке больше одного удаляемого элемента, то уже при втором удалении цикл по j найдет "не тот" элемент, а следующий, т.е. который будет удаляться.
И, да, нуление указателя на m_next и указатель на предыдущий узел решают все проблемы.
Будет что-то вроде:
while(m_head && m_head->m_data==value)
{
Node *victim = m_head;
m_head = m_head->m_next;
delete victim;
}
if(m_head=NULL)
{
return;
}
Node *chkNode = m_head->m_next;
Node *prevNode = m_head;
while(chkNode)
{
if(chkNode->m_data==value)
{
prevNode->m_next = chkNode->m_next;
delete chkNode;
chkNode = prevNode->m_next;
}else{
prevNode = chkNode;
chkNode = chkNode->m_next;
}
}