题目
解题思路
一开始没理解题目为什么要限制不是最后一个节点,因为如果是最后一个节点,无论如何都无法实现在不访问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;
}
}