Node* deleteAtTail(Node* head)
{
if (head == NULL) /* If List is empty... */
{
return NULL;
}
else /* If List has 1 item... */
if (head -> next == NULL)
{
free(head);
return NULL;
}
else
{
Node* currentNode = head; /* Traversal Pointer */
Node* previousNode = NULL; /* Traversal Pointer */
while(currentNode -> next != NULL)
{
previousNode = currentNode; /* Move up previous node */
currentNode = currentNode -> next; /* Move up current node */
}
previousNode -> next = NULL; /* Make previousNode the new tail */
free(currentNode); /* Delete currentNode pointer */
return head;
}
}
如果我删除/注释掉
previousNode -> next = NULL;
,程序就会陷入无限循环。
为什么会这样?在我看来,
head
及其列表没有更改,仅复制到 currentNode
指针,并且我返回一个未更改的列表。 previousNode
和currentNode
都在函数范围内,那么如果previousNode
的next
指针没有设置到NULL
,为什么程序会失败呢?
您已释放列表中的最后一个节点 (
currentNode
)。如果您不将 previousNode->next
(与 currentNode
相同的指针)设置为 NULL
,那么您将得到一个悬空指针,并且当尝试取消引用该指针时,迭代列表将调用未定义的行为.