我试图实现一个循环链表,我读过去掉尾部(有直接引用)的复杂性是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,removeare local和tail是列表的尾部,tail.getNext()的第一个实例是head。
我也试过了下面的内容,但它不起作用,因为尾部之前的节点仍然指向尾部,并且没有删除引用。我知道我需要将尾巴的前一个点放在头部以便移除尾部而上面的代码执行此操作,但我只是不确定如何执行此操作以及是否可能没有循环列表..
remove = tail;
tail= lastNode.getNext();
size--;
return remove;
答案 0 :(得分:1)
在循环链接列表中,每个节点都有上一个和下一个。有第一个节点的 head 指针,它的前一个是尾节点,其下一个是头节点。
所以
Node removeTail() {
if (head == null) {
return null;
}
Node tail = head.previous;
Node newTail = tail.previous;
newTail.next = head;
head.previous = newTail;
if (head == tail) {
head = null;
}
--size;
return tail; // If so desired.
}