【发布时间】:2015-06-05 15:32:46
【问题描述】:
我尝试实现一个循环链表,并且我读过删除尾部(具有直接引用)的复杂性是 O(1)。但是,如果不循环,我就无法摆脱尾部引用,导致复杂度为 O(n),所以我想知道如果不循环,这是否可能?
remove = tail;
prev = temp = tail.getNext();
do
{
prev = temp;
temp = temp.getNext();
}
while(!temp.getNext().equals(tail.getNext()));
prev.setNext(temp.getNext());
size--;
return remove;
注意:prev、temp、remove 是本地的,tail 是列表的尾部,tail.getNext() 的第一个实例是头部。
我也尝试过以下方法,但它不起作用,因为 tail 之前的节点仍然指向 tail 并且引用没有被删除。我知道我需要将尾巴的前一个点指向头部才能删除尾巴,上面的代码就是这样做的,但我只是不确定如何做到这一点,以及是否可以不循环遍历列表..
remove = tail;
tail= lastNode.getNext();
size--;
return remove;
【问题讨论】:
-
您需要循环查找尾节点的上一个节点..然后将上一个节点指向头节点的下一个引用。要查找尾节点的上一个,您需要循环直到找到下一个节点的下一个是头节点。
标签: java algorithm data-structures