问题:给定一个单链表中的一个等待被删除的节点(非表头或表尾)。请在在O(1)时间复杂度删除该链表节点。
思路:因为题目只给了一个待删除节点,所以,我们不能使用遍历。
我们只需要将当前节点的值被下一个节点的值覆盖就好。注意,末尾的节点没有值可以覆盖,所以我们要单独处理它。即,将last node 的next指针指向next node。完美地忽略它。
Python3
"""
Definition of ListNode
class ListNode(object):
def __init__(self, val, next=None):
self.val = val
self.next = next
"""
class Solution:
# @param node: the node in the list should be deleted
# @return: nothing
def deleteNode(self, node):
# create a node to store the last node of current node
last_node = node
# when the current node is not null
while node != None:
# when the next node is null, then delete the current node
if node.next == None:
last_node.next = node.next
break
# use the next node to replace the current node
node.val = node.next.val
# regard the current node as the last node
last_node = node
# jump to the next node
node = node.next
其实在处理最后一个尾节点上,我有想过要直接删除该点,但是在python中都是引用。所以,del语句作用在变量上,而不是数据对象上。也就是说,当我把一个变量名删除,我只是删除了一个引用,数据(节点)还在,依旧可以被找到。
Java
/**
* Definition for ListNode.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int val) {
* this.val = val;
* this.next = null;
* }
* }
*/
public class Solution {
/**
* @param node: the node in the list should be deleted
* @return: nothing
*/
public void deleteNode(ListNode node) {
// create a node to store the last node of current node
ListNode last_node = node;
// when the current node is not null
while(node != null)
{
// when the next node is null, then delete the current node
if (node.next == null)
{
last_node.next = node.next;
break;
}
// use the next node to replace the current node
node.val = node.next.val;
// regard the current node as the last node
last_node = node;
// jump to the next node
node = node.next;
}
}
}
在java的算法里,我也尝试了直接删除尾节点,即 node = null;等待java的垃圾回收机制进行回收。
但是效果欠佳,我想主要是因为这个回收机制是有一定的时间触发和一定的触发条件,所以在短暂的时间内,它做不到垃圾回收的。
最后
我用python 的运行时间(编译时间+执行时间) 比java的少了一个数量级。但是普遍认识是Java的效率更高,矛盾?