为什么我们在删除之前将链表的下一个指针初始化为 NULL

Why we initialize the next pointer of Linked List as NULL before deletion

提问人: 提问时间:10/15/2022 更新时间:10/16/2022 访问量:280

问:

为什么我们在删除之前将链表的下一个指针初始化为 NULL 我们在删除过程中将头移动到下一个节点,并释放第一个节点的内存,那么为什么我们需要在删除之前将已删除节点的下一个指针初始化为 NULL。 没有它,代码运行没有任何问题。 这个悬空的指针会产生问题吗?请给它一些光

class Node
{
    public:
    int data;
    Node* next;
    
    Node(int d)     //construtor for storing the value in nodes
    {
        this->data=d;
        this->next=NULL;
    }
};
void DeleteAt(int position,Node* &head,Node *&tail)
{
    if(position ==1)
    {   
        Node* temp=head;
        head=temp->next;
        temp->next=NULL;
        delete temp;
    }
    else
    {
        Node *curr=head;
        Node *prev=NULL;
        int cnt=1;
        while(cnt<position)
        {
            prev=curr;
            curr=curr->next;
            cnt++;
        }
        // if delete at tail is called ,for updation of tail,
        //if required
        if(curr->next==NULL)
        {
            tail=prev;
        }
        prev->next=curr->next;
        curr->next=NULL;
        delete curr;
    }
}
C++ 指针 linked-list delete-operator dangling-pointer

评论

2赞 WhozCraig 10/15/2022
你不需要这样做,除非某个疯子认为自己是“聪明的”,并编写了 a 的析构函数,以自动神奇地循环或递归来摧毁链的其余部分,从 .自我保护步骤。你的代码没有这样做(顺便说一句,这很好),所以在这里毫无意义。Nodenext

答:

0赞 CoffeeTableEspresso 10/15/2022 #1

你不需要这样做,它只是为了在你学习时帮助你。教师通常会这样做,以帮助避免释放后使用。这样一来,你就有问题了,因为如果你不小心尝试使用你刚刚删除的节点,你可能会得到一个段错误。

评论

0赞 10/15/2022
我们正在释放 temp 指向的内存,即我们也在删除其中的数据和内容,对吧?下一个指针指向下一个节点,所以当我们删除临时时,下一个指针也会被删除,所以下一个指向的内存(即下一个节点)也应该被删除,我知道我听起来不好,但如果你明白我的观点,你能更澄清一下吗
1赞 user12002570 10/15/2022
取消引用 null 指针并不能保证会造成段错误。在取消引用 null 指针时保证段错误
0赞 Spencer 10/15/2022
@VishalMourya 只有在析构函数中完成时,下一个指针才会被删除。由于您没有声明执行此操作的析构函数,因此它只会删除一个 .指针处的对象不会发生任何反应。Nodenext
0赞 CoffeeTableEspresso 10/15/2022
@JasonLiam,根据这个问题,我想说这可能是 OP 的第一门C++课程,所以我认为在这一点上不宜详细介绍 UB。
0赞 user12002570 10/15/2022
@CoffeeTableEspresso OP是否是初学者无关紧要。您仍然不能声称取消引用 null 指针会给您带来段错误。