删除链表中间节点(变形题目,简单难度)

题目概述(简单难度)

若链表中的某个节点,既不是链表头节点,也不是链表尾节点,则称其为该链表的「中间节点」。

假定已知链表的某一个中间节点,请实现一种算法,将该节点从链表中删除。

例如,传入节点 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:替换删除法这个思路也是非常巧妙的一个思路,可以重点学习下.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值