【问题标题】:Inserting elements into a LinkedList in ascending order按升序将元素插入 LinkedList
【发布时间】: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 实际上更快。我想知道是什么让它显而易见?
  • 好吧,如果您没有必须使用链表,您可能会使用树集、优先级队列或其他排序集合之类的东西。而且我并没有将您的解决方案与使用数组列表进行对比,这是一个不同的问题。如果您的练习是在链接列表之上实现类似的东西,那么我仍然不明白如果不将其与其他列表进行比较,您将如何获得链接数据结构中列表遍历的影响数据结构。再说一次,这可能就是我。

标签: java list


【解决方案1】:

添加方法可以接受两个输入。

void add(int index, Object element)

https://www.geeksforgeeks.org/java-util-linkedlist-add-method-in-java/

进行二分查找,找到位置,使用add方法......

【讨论】:

    猜你喜欢
    • 2011-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-19
    • 1970-01-01
    相关资源
    最近更新 更多