首页 > 解决方案 > 在复制节点后删除经典节点结构时,我们是否必须担心可能的覆盖?

问题描述

https://leetcode.com/problems/delete-node-in-a-linked-list/description/

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */

问题陈述:给定一个至少大小为 2 的链表,给你一个指向其中一个节点的指针(保证不是尾部)。删除节点。

链表[1,2,3,4],输入:2,正确输出:[1,3,4]

void deleteNode(ListNode* node) {
    ListNode* next = node->next;
    *node = *(node->next);
    delete next;
}

以上是一个有效的解决方案。但是,我认为它不应该是正确的。

原因:在函数的第 2 行,您正在复制整个节点的值/内容。因此,您最终会复制 int 值以及下一个节点的地址(即下一个节点指针)。

但是,在函数的第 3 行也是最后一行,您最终会删除 next(相当于 node->next)。

当您将来进行足够的分配时,这不会导致覆盖问题吗?据我了解,下一个指针现在保存着刚刚删除的地址空间。

如果我的理解有误,我非常感谢有人纠正我。

标签: c++algorithmmemory-managementdata-structureslinked-list

解决方案


让我们逐步研究函数:

ListNode* next = node->next;

在这里,您将给定的节点复制next到一个临时指针中,到目前为止一切都很好。例如,如果你{1, 2, 3, 4}现在给这个函数的第二个节点next是 3,它是第三个项目。

 *node = *(node->next);

将给定节点的下一个内容复制到节点中,正如您所提到的,这也会将其复制到它旁边。继续给出的例子现在你有{1, 3, 3, 4}哪个 3s(第二个和第三个项目的下一个是 4(第四个项目))。

delete next;

接下来删除。现在,给定过去的示例,您在这里所做的是删除第二个 3(第三项)。你的结果将是{1, 3, 4}

此方法不会删除确切的给定节点(我的意思是它不会删除给定的指针),但它会将它的下一个复制到其中,然后删除下一个,它按预期工作。

在此处输入图像描述


推荐阅读