算法
(链表) $O(1)$
由于是单链表,我们不能找到前驱节点,所以我们不能按常规方法将该节点删除。
我们可以换一种思路,将下一个节点的值复制到当前节点,然后将下一个节点删除即可。
时间复杂度
只有常数次操作,所以时间复杂度是 $O(1)$。
C++ 代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
void deleteNode(ListNode* node) {
auto p = node->next;
node->val = p->val;
node->next = p->next;
// 这两步的作用就是将 *(node->next) 赋值给 *node,所以可以合并成一条语句:
// *node = *(node->next);
delete p;
}
};
借尸还魂了属于是
哈哈哈哈哈笑死了
形象啊哈哈哈
好像给你点个赞
不点赞也挺好的,能看到大家的真实想法而不是浮于点赞。
哈哈哈
one-line solution:
*node = *(node->next);
妙啊,更新在了题解的代码中~
巧妙的运用了解引用,不错
这,果然我是fw
好狠的操作= =
是的hh
读代码读出了小学读的玄幻小说里的夺舍的味道
想象力很丰富啊
还能这么做,真的强,学到了
实际上不一定要delete p,因为p的前驱节点的后继节点指向的已经是p的后继节点了,所以访问时不会访问到p了,即使最后统一释放内存调用destructor也可以
妙啊
太巧妙了啊啊啊
厉害,我都忘了写delete回收内存了
Y总威武。这样的办法,太好了。
这道题主要在于没有前驱结点的情况下,思路是用后面的覆盖前面的,然后将后面的删除。相当于删除了当前结点
对滴,总结的很好
将当前val赋给下一个结点,然后将下一个结点跳过,那本来的它的下一个结点的值不就被覆盖并且跳过了吗
我真是个fw
Orz
为什么不能直接delete node
直接删掉的话会使链表的“链接”断掉
妙啊
节点的跳过
我有个问题,如果待删除节点为单链表的尾节点,所以它的下一个节点为null,按照这样的写法,是存在问题的。能给出一个对于尾节点的处理思路吗?
假设链表一定存在,并且该节点一定不是尾节点。
删除不了最后一个吧
假设链表一定存在,并且该节点一定不是尾节点。
tql