难度:⭐
题目描述:
请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点。传入函数的唯一参数为 要被删除的节点 。
现有一个链表 — head = [4,5,1,9],它可以表示为:
示例1:
1 | 输入:head = [4,5,1,9], node = 5 |
示例2:
1 | 输入:head = [4,5,1,9], node = 1 |
提示:
- 链表至少包含两个节点。
- 链表中所有节点的值都是唯一的。
- 给定的节点为非末尾节点并且一定是链表中的一个有效节点。
- 不要从你的函数中返回任何结果。
解题过程:
思路:
题目和之前的一道题几乎一样,参考题目。
依次把删除节点下一个节点的值赋值给当前节点,也就是说把要删除的节点当做下一个节点,这样把要删除节点后面的链元素依次前移。处理特殊情况:删除的是倒数第二个节点因为它下一个节点是最后一个节点,依次调用deleteNode函数,若删除节点是倒数第二个,则直接next指针为NULL,否则递归调用deleteNode函数。
c++代码:(执行用时20ms,击败36.18%,内存消耗8.1M,击败5.22%)
1 | /** |
官方题解:
方法:与下一个节点交换
从链表里删除一个节点 node
的最常见方法是修改之前节点的 next
指针,使其指向之后的节点。
因为,我们无法访问我们想要删除的节点 之前 的节点,我们始终不能修改该节点的 next
指针。相反,我们必须将想要删除的节点的值替换为它后面节点中的值,然后删除它之后的节点。
1 | public void deleteNode(ListNode node) { |
官方题解给出了java代码,我根据思路改成了c++代码如下:
c++代码:(执行12ms,击败97.32%,内存8.1M,击败5.22%)
1 | /** |
复杂度分析
时间和空间复杂度都是:$O(1)$。
总结:
官方题解这个思路很好,我是想到用把删除节点及以后节点的val值变成下一个节点的值,把最后倒数第二个节点的next指针置为空,想复杂了,直接把删除节点的next值也换成下一个节点的值就ok了,实际上删除的是要删除节点的下一节点,妙啊。