题目概述(简单难度)
若链表中的某个节点,既不是链表头节点,也不是链表尾节点,则称其为该链表的「中间节点」。
假定已知链表的某一个中间节点,请实现一种算法,将该节点从链表中删除。
例如,传入节点 c(位于单向链表 a->b->c->d->e->f 中),将其删除后,剩余链表为 a->b->d->e->f
在此附上leetcode链接:
点击此处进入leetcode
思路与代码
思路展现
这道题目跟之前有所不同的是,这道题目并没有给我们头节点,只是给了一个要删除的"中间节点“。
所以针对这道题目的做法:我们不能再像之前那样遍历链表,而是用一种全新的思维:替换删除法
先来看一个实例:
假设此时我们要删除的节点是值域为78这个节点,node指针此时指向这个节点,我们的思路是这样的:
1:既然要删除值域为78的节点,相当于删除后的链表是这样子的
既然这样,我们就可以用替换删除法,将要删除的节点的值域变成即将要被删除的节点的下一个节点的值域,即node.val=node.next.val,这样78变成了15,但是next域也需要变化.
2:当然变换值域还不够,还要将node指针所指向的要删除的节点的next域变成node指针所指向节点的下一个节点的next域的值,即node.next=node.next.next,这样我们就完成了偷梁换柱.
3:当然我们写代码时候有的同学会纠结node是链表头节点和尾节点的情况,大家大可不用担心,因为node在题目中设置的就是除了这两个节点以外的情况.
代码示例
class Solution { public void deleteNode(ListNode node) { //如果没有这个中间节点,方法直接结束 if(node==null){ return; } node.val=node.next.val; node.next=node.next.next; } }
总结
1:此算法:
时间复杂度:O(1)
2:替换删除法这个思路也是非常巧妙的一个思路,可以重点学习下.