[英]Removing/undoing a node in doubly linked list
我知道删除双链表中的节点的时间复杂度为O(1)。 我看到了很多代码示例,其中人们在双链表的remove方法中使用循环,但时间复杂度仍为O(1)。 我已经编写了撤消代码,即删除了双向链表中的节点,但是我的问题是:我的代码会撤消/删除undo()
方法中O(1)中的节点,因为我调用了getNode()
方法,包含一个循环? 我会很高兴的解释! 提前致谢!
private Node <T> getNode( int idx ){
return getNode( idx, 0, size( ) - 1 );
}
private Node<T> getNode( int idx, int lower, int upper ){
Node<T> p;
if( idx < lower || idx > upper ){
throw new IndexOutOfBoundsException( "getNode index: " + idx + "; size: " + size( ) );
}
if( idx < size( ) / 2 )
{
p = beginMarker.next;
for( int i = 0; i < idx; i++ )
p = p.next;
}
else
{
p = endMarker;
for( int i = size( ); i > idx; i-- )
p = p.prev;
}
return p;
}
public void undo(){
if(isEmpty()){
throw new RuntimeException("Undo history is empty");
}
else{
T data = undoStackDatas.topAndPop();
int index = undoStackIndexes.topAndPop();
//Push data and index back into redo stacks
redoStackDatas.push(data);
redoStackIndexes.push(index);
Node<T> obj = getNode(index);
if(obj == beginMarker){
beginMarker = obj.next;
}
else{
obj.prev.next = obj.next;
}
if(obj == endMarker){
endMarker = obj.prev;
}
else{
obj.next.prev = obj.prev;
}
theSize--;
modCount--;
}
}
如果您得到必须删除的节点,则从双链表中删除该节点的操作是O(1)。
但是在这种情况下,您必须搜索该节点,那么复杂度将因搜索而改变。 在这种情况下,您的复杂度将变为O(n)。
您将添加for循环的时间复杂性,因为当您跟踪代码的执行路径时,需要遍历那些for循环才能完全执行for循环。 您不能使用方法调用来减少时间复杂度,因为在程序执行期间,所有执行的语句都会被计数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.