程序员面试经典—— 02.03. 删除中间节点

文章讲述了如何在给定链表中某非头尾中间节点的情况下,使用双指针法删除该节点,以及提供了一个审题错误的解决方案。
摘要由CSDN通过智能技术生成
02.03. 删除中间节点

简单

提示

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

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

例如,传入节点 c(位于单向链表 a->b->c->d->e->f 中),将其删除后,剩余链表为 a->b->d->e->f

示例:

输入:节点 5 (位于单向链表 4->5->1->9 中)
输出:不返回任何数据,从链表中删除传入的节点 5,使链表变为 4->1->9

通过率

85.8%

尝试一:双指针(走一步,和走两步)

想着用deleteFlag作为left的上一个指针,但是解答错误

/**
双指针
 */
class Solution {
    public void deleteNode(ListNode node) {
        ListNode left = node,right = node,deleteFlag = node;
        boolean firstFlag = false;
        //&& right.next.next != null无需此条件,在链表中right遍历当前位置的节点时可以为null
        while(right != null && right.next != null){
            //当left遍历到该删除的位置上时,这个时需要deleteFlag才能删除left当前所在元素
            if(firstFlag) deleteFlag = deleteFlag.next;
            firstFlag = true;
            left = left.next;
            right = right.next.next;
        }
        //删除left所在中间(需要删除)的节点
        deleteFlag.next = left.next;
        return;
    }
}
解答错误
执行用时: 0 ms
Case 1
输入
[4,5,1,9]
5
输出
[4,5,9]
预期结果
[4,1,9]

审题错误!!!当前head已经指向了需要删除的那个节点呢!

/**100.00%
*
*/
class Solution {
    public void deleteNode(ListNode node) {
        // 首先确保节点不是尾节点
        if (node == null || node.next == null)
            return;
        
        // 将下一个节点的值复制到当前节点
        node.val = node.next.val;
        // 跳过下一个节点
        node.next = node.next.next;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值