为什么如果 previousNode->next 没有设置为 NULL,这个 C 链表函数就无法正常工作?

问题描述 投票:0回答:1
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
,为什么程序会失败呢?

c pointers data-structures linked-list singly-linked-list
1个回答
0
投票

您已释放列表中的最后一个节点 (

currentNode
)。如果您不将
previousNode->next
(与
currentNode
相同的指针)设置为
NULL
,那么您将得到一个悬空指针,并且当尝试取消引用该指针时,迭代列表将调用未定义的行为.

© www.soinside.com 2019 - 2024. All rights reserved.