目的:在给定一个链表,删除指定的节点,让其时间复杂度为O(1)
实现思路:让给定节点node的下一个节点p的value赋值给node,再让p=node的next的next。
这种方法,当待删除节点为最后一个节点时,该方法就出错了,就使用遍历的方法来删除。删除最后一个节点的时间复杂度为O(n),但是前面n-1和节点删除的时间复杂度为O(1),总体来看,这种方法满足条件,使时间复杂度为O(1)。
思路:该节点的前驱无从着手,但后继容易获得。
* 若该节点非末尾结点,则可以把后继结点复制给该节点。
* 代码:
* node.data=node.next.data;
node.next=node.next.next;
若该节点为末尾结点,即node.next==null时。需从头遍历,此时时间复杂度为O(N)
综上时间复杂度为:(O(1)*(N-1)+O(N))/N=O(1)
public void removeNode(Node<T> node){
if(node==null){
return;
}
if(node.next!=null){
node.value=node.next.value;//当前节点node,下一个节点value赋值为当前节点
node.next=node.next.next;//删除node的下一个节点
}//O(1)
//如果为尾节点的话
removeTail();//O(n)
}