这是使用Java链表。我有两个链表。我想通过将第0个列表中的最后一个节点链接到第1个列表的第0个节点来将它们添加在一起。目前,我可以通过迭代第二个列表并添加其中的每个元素来将它们附加在一起,如下所示:
LinkedList<HashSet<Integer>> ll = someList;//Some random list
LinkedList<HashSet<Integer>> subSetLl = getSubsets(inSetSub);//Also some list
for (HashSet<Integer> set : subSetLl){
ll.add(set);
}
但是,由于这些都是链表,因此应该有一种更有效的方法将它们添加在一起,方法是将一个链表的末尾指向下一个链表。这样的东西存在吗?
为清楚起见,请编辑:当前方法在O(n)中运行,其中n是第一个链表的长度。如果两个元素都是链表,是否有O(1)方法可以实现这一点?
我认为唯一的方法是复制LinkedList类的实现,然后更改addAll方法以识别传递的集合是否属于同一类。此外,您必须意识到,如果您将列表添加到末尾,这是不安全的,因为一个列表中的更改可能会导致另一个列表的更改。如果你复制内存并使其安全,就没有办法提高效率,因为你无论如何都在循环元素。
从javadoc
到LinkedList
:
addAll(集合c)将指定的集合到此列表的末尾,按它们的顺序由指定集合的迭代器返回。
公共布尔值addAll(集合c)
追加所有指定集合中的元素添加到此列表末尾,在指定集合的迭代器返回它们的顺序。如果指定在操作进行时修改集合。(注意如果指定的集合是此列表,并且非空。)
参数:
c-包含要添加到此列表的元素的集合
返回:
如果此列表由于调用而更改,则为true
LinkedList.addAll(index,Collection)
将指定集合中的所有元素插入列表,从指定位置开始。当前移动元素在该位置(如果有的话)和右边的任何后续元素(增加了他们的指数)。新元素将出现在中的列表中指定集合返回它们的顺序迭代器。