我们的家庭作业要求我们证明Java LinkedList
实现是双重链接而不是单链接。但是,列表操作(如添加元素,删除元素和查找元素)似乎对两个实现都具有相同的复杂性,因此似乎没有办法使用性能参数来演示Java的双重链接特性。 LinkedList
。有谁知道更好的方式来说明两者之间的差异?
答案 0 :(得分:2)
查看向前或向后迭代,删除“before-last”元素,等等。
答案 1 :(得分:2)
这是一个非常简单的证明 - 您查看源代码并看到每个节点都有一个.previous
指针:)
http://www.docjar.com/html/api/java/util/LinkedList.java.html
答案 2 :(得分:0)
考虑以下节点,单个和双重。
class SingleLinkedNode { E数据; SingleLinkedNode接下来; }
class DoubleLinkedNode { E数据; DoubleLinkedNode prev; DoubleLinkedNode接下来; }
如果我们想从DoubleLinkedList中删除(假设我们已经找到了节点,这是非常不同的)我们需要做什么?
如果我们想要从SingleLinkedList中删除(假设我们已经找到了节点,这是非常不同的)我们需要做什么?
你认为这意味着它在单个链表中比在双重列表中更快。
但是,如果我们之前没有对该节点的引用,我们如何删除该节点呢?我们只提到了下一个。难道我们不必在列表上进行其他搜索才能找到上一个吗? :-O
答案 3 :(得分:0)
Java List接口没有允许您在不搜索链接列表的情况下删除项目的方法。它有remove(int index),它必须扫描列表才能找到索引条目,它还有remove(Object o),它也必须扫描列表。由于链接列表实现可以在扫描时保存必要的先前项目条目上下文,因此删除对于单链接和双链接列表具有相同的复杂性。此状态也可以保存在迭代器中,因此Iterator.remove()不会更改它。所以我认为你不能从删除性能中得知。
我的猜测是,对此的“正确”答案是创建几个不同大小的列表,并在搜索第一个或最后一个对象时计算.indexOf()和.lastIndexOf()的性能。假设实现是双向链接的,并从列表的开头搜索.indexOf()并从末尾搜索.lastIndexOf(),性能将取决于长度或与长度无关。