我正在尝试实现自己的LinkedList,现在我的问题正在消除。 我需要至少删除O(1)中的最后一个元素,但是我不能这样做。 在我所看到的每种情况下,人们都在从头到(last-1)元素进行简单循环,以这种方式去除尾巴。但是它具有O(n)的复杂度。 我也从java.util找到了LinkedList。正在使用迭代器。 所以我的问题是-是否可以在不使用迭代器的情况下删除最后一个元素,或者我也需要实现迭代器类? 那就是我的popBack()方法代码:
private void popBack(){
if(!isEmpty()) {
--size;
T temp = tail.info;
//tail.next = null;
//tail.prev.getNext();
tail = tail.prev;
System.out.println(temp);
}
else{
System.out.println("OH SHI-, List is empty");
}
}
(在这里我改变了我的尾巴,但是我没有用那个尾巴连接上一个元素,所以前一个元素仍然是一个旧元素)
答案 0 :(得分:0)
看起来您的列表是一个双链表,并且您确实引用了最后一个元素(代码中的tail
),这意味着您可以在O(1)
的时间内删除最后一个元素。
您的尝试几乎是正确的。除了将tail
引用更改为引用tail.prev
之外,还必须将新尾巴的next
引用设置为null
。
列表中的其他节点均不受影响。
private void popBack(){
if(!isEmpty()) {
--size;
T temp = tail.info;
tail = tail.prev;
tail.next = null;
System.out.println(temp);
}
}
对于被删除的元素是唯一元素(在这种情况下tail.prev
可能为null)的情况下,您可能必须添加另一项检查,并且在删除之后列表为空。