c++ - 在复制节点后删除经典节点结构时,我们是否必须担心可能的覆盖?
问题描述
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)。
当您将来进行足够的分配时,这不会导致覆盖问题吗?据我了解,下一个指针现在保存着刚刚删除的地址空间。
如果我的理解有误,我非常感谢有人纠正我。
解决方案
让我们逐步研究函数:
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}
。
此方法不会删除确切的给定节点(我的意思是它不会删除给定的指针),但它会将它的下一个复制到其中,然后删除下一个,它按预期工作。
推荐阅读
- node.js - 如何在 nestjs/mongoose 的 mongodb 中获取嵌套的填充属性
- spring - 客户端部分如何通过 RabbitMQ 与服务进行通信?
- angular - Gitlab runner CI 正在测试 node_modules
- python - Pymysql-将混合类型的数据添加到数据库记录中的问题
- android - 在 ROOM 中找不到正确的关系和架构保存数据
- javascript - 万一失败,如何继续运行 package.json 中定义的脚本?
- wavesplatform - 从 Waves Exchange 获取我的加密货币的市场价值
- google-analytics - GA 衡量协议:尽管使用 SubID 发送了太多目标,但最终还是“直接”
- java - 为什么以下问题的所有测试用例都没有通过?
- spring - 将字符串从方面传递到 JointPoint