LC237.删除链表中的节点(无法访问head的情况)

题目

查看题目

解题思路

一开始没理解题目为什么要限制不是最后一个节点,因为如果是最后一个节点,无论如何都无法实现在不访问head的情况删除指定元素。
一开始想法就是思考怎样处理被删除点的前一个节点与被删除点后一个节点之间的联系,但是向找到被删除点的前一个节点是不现实的,因此转换思路,考虑把节点的值进行替换(因为只有val不相同)所以第一次做的时候就是定义一个point指针在node的下一个位置,然后两个指针不停向链表末尾前进,用point的val替换掉node的val,将被删除元素调整到最后一个元素,但是问题又来了,怎们删除最后一个元素,直接赋值成null是不现实的,所以可能又要定义一个指针,找到这个最后元素,再把它删除,但是这样又需要遍历一遍链表,效率非常低O(n)。
最后想到一个方法,不需要将被删除元素移动到最后一位,只要移动到node的下一位就可以按照平时删除元素的流程将其删除即可,相当于node的下一元素就是被删除元素,又因为node不是最后一个元素,起下一个元素一定存在,放心大胆的将将node.next指向node.next.next即可。这里定义一个指针就可以,我代码中 node.val=point.val; node.next=point.next;可以修改为node.val=node.next.val; node.next=node.next.next;效果是一样的,效率更高。

代码

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public void deleteNode(ListNode node) {
        ListNode point=node.next;
        
         node.val=point.val;
         node.next=point.next;
         //或者使用下面两行
         //node.val=node.next.val;
        //node.next=node.next.next;
        
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值