【发布时间】:2021-06-05 10:15:46
【问题描述】:
我试图找到一种有效的方法将Integer 元素插入java.util.LinkedList 列表,同时始终保持升序。例如:
5 -> [] => [5]
1 -> [5] => [1, 5]
3 -> [1, 5] => [1, 3, 5]
0 -> [1, 3, 5] => [0, 1, 3, 5]
这纯粹是理论上的问题,要了解链表遍历对链接数据结构的影响,请参阅this presentation。我对批量插入 Integer 元素或在末尾对 LinkedList 进行排序不感兴趣。
我可以使用ListIterator,但是它需要两个方法调用。我必须执行set(),然后是add(),例如:
var numbers = new Integer[] { 5, 1, 3, 0, ... };
var list = new LinkedList<Integer>();
outer:
for (Integer num : numbers) {
var it = list.listIterator();
while (it.hasNext()) {
var el = it.next();
if (num <= el) {
it.set(num);
it.add(el);
continue outer;
}
}
it.add(num);
}
有没有更有效的方法来解决这个问题?
除非 JDK 中已经有不同的链表数据结构实现,并且它更适合这项任务,否则我没有兴趣将 java.util.LinkedList 换成其他东西。
【问题讨论】:
-
您的真实用例是否无法简单地对
numbers进行排序?我不认为这会比您当前的实施效率低。 -
@ernest_k 没有真正的用例,这是一个理论上的问题来理解链表遍历在链接数据结构中的意义,见youtube.com/watch?v=YQs6IC-vgmo
-
对我来说似乎很清楚链表是解决此问题的错误选择。而且从你想坚持下去的事实来看,我看不出你的分析结果是什么预期的。但这可能只是我。
-
@ernest_k 你能解释一下为什么
LinkedList显然是这个问题的错误选择吗?我链接的视频显示这个问题并不明显,LinkedList的插入操作比ArrayList具有更好的复杂性,但是ArrayList对于大型N实际上更快。我想知道是什么让它显而易见? -
好吧,如果您没有必须使用链表,您可能会使用树集、优先级队列或其他排序集合之类的东西。而且我并没有将您的解决方案与使用数组列表进行对比,这是一个不同的问题。如果您的练习是在链接列表之上实现类似的东西,那么我仍然不明白如果不将其与其他列表进行比较,您将如何获得链接数据结构中列表遍历的影响数据结构。再说一次,这可能就是我。