C语言释放链表节点出现错误

current = head; 
while (current != NULL) 
{
current = head; 
head = current->next; 
free(current);
}

这是书上的一段代码,但是程序在执行过程中却无法正常停止,出现报错,请问是什么原因?

但是将这段代码调换一下顺序后却能正常运行:

current = head; 
while (current != NULL) 
{
head = current->next; 
free(current);
current = head; 
}

第一段代码再进行第二次循环前最后一条语句已经释放了current指针,而第二次循环的条件却又引用了已经释放的current指针,当然有错误啦