【问题标题】:java sorting a integers linked listjava对整数链表进行排序
【发布时间】:2016-11-11 17:43:45
【问题描述】:

我创建了一个整数链表,但我不知道如何排序! iv 尝试了很多,但列表中的数字总是消失 这是我用于链表的代码!

import java.util.Random;

class Node {
Node next;
int num;

public Node(int val) {
    num = val;
    next = null;
}
}

public class LinkedList {

Node head;

public LinkedList(int val) {
    head = new Node(val);
}

public void append(int val) {
    Node tmpNode = head;
    while (tmpNode.next != null) {
        tmpNode = tmpNode.next;
    }
    tmpNode.next = new Node(val);
}

public static void main(String[] args) {
    Random rn=new Random();
    int min=0;
    int max=1000;
    LinkedList myList = new LinkedList(rn.nextInt((max - min) + 1) + min);
    for(int i=0;i<100;i++){
        int x=rn.nextInt((max - min) + 1) + min;
        myList.append(x);
    }
    myList.print();
}
}

【问题讨论】:

  • 对数组进行排序有多种方法:归并排序、快速排序、冒泡排序等。您应该知道如何实现其中的一些。谷歌是你的朋友。 :)
  • 对链表进行排序有点棘手,因为它没有随机访问。如果您想使用标准排序算法,最好将数据复制到数组并对其进行排序。
  • 如果你只想对整数进行排序,我建议你使用 TreeSet 而不是 LinkedList。
  • @MohamedBathaoui 这两个完全不同。最明显的是,TreeSet 不支持重复。因为它是Set
  • 是的,我同意@BoristheSpider。这就是为什么我提到“唯一”这个词。一切都是为了对他的情况进行整数排序。

标签: java arrays arraylist linked-list swap


【解决方案1】:

这一行

LinkedList myList = new LinkedList(rn.nextInt((max - min) + 1) + min);

根据the LinkedList API 似乎没有多大意义。而且您应该真正使用 Java 的 LinkedLists,而不是自己滚动,这样您就可以使用 List 和 Collection API 和泛型。

一旦你使用 java.util.LinkedList 你可能想调用

myList.sort();

对列表进行排序,或为其提供一个比较器,如下所示:

  import java.util.Comparator;
  import java.util.LinkedList;

  Comparator<Integer> order = Integer::compare;
  myList.sort(order.reversed());

顺便说一句,蜘蛛鲍里斯的评论很到位。这就是 java 8 的标准实现对 LinkedLists 的处理方式,它使列表成为数组,在 O(n log n) 中对数组进行排序,然后将每个项目放在 O(n) 中的位置:

 default void sort(Comparator<? super E> c) { //O(n log n)
    Object[] a = this.toArray(); //O(n)
    Arrays.sort(a, (Comparator) c); //O(n log n)
    ListIterator<E> i = this.listIterator();
    for (Object e : a) { //O(n)
        i.next();      //O(1)
        i.set((E) e);  //O(1)
    }
}

顺便说一句:我在您的代码中没有看到任何“print()”方法的实现。确定它打印正确的值? 而且我在您的代码中没有看到任何排序方法的实现,那么我们怎么知道排序时数字是如何丢失的呢?

【讨论】:

  • 如果我想使用来自 java 的链表...我已经准备好了但我不想使用它...我被要求这样做
  • 如您所知,如果您保存对第一个和最后一个元素的引用并使用较短的路径,则对链表的索引访问是 O(n) - 或 O(n/2)。因此,在每个列表节点上设置每个值是一个 O(n) 操作 n 次,相当于 O(n²)。您可以比这更快地构建一个列表 - 您可以从排序数组创建一个 new 列表,这是一个 O(n) 操作添加到 O(n log n) 排序操作,相当于O(n log n)。上面JDK8 List接口的原始源码中没有这样做,在JDK8中LinkedList确实使用了默认的方式,去图吧。
  • @BoristheSpider Dang,对不起,你是对的,我只是将索引访问误认为是迭代访问。我会更正答案。
  • 好多了!唯一的问题是这个答案是关于 Java 的 LinkedList,而问题是关于 OP 的自定义 LinkedList。所以答案的第一部分是不相关的 - OP 的 ctor 设置了 head 节点。
  • 无论您是否滚动自己的 LinkedList(不建议),排序策略都可以以相同的方式工作,除非要求说明您需要内联排序。除此之外,原始发布者选择不发布他的 print() 方法和他的排序尝试,这意味着我们实际上无法回答他的问题,为什么他的列表内容在排序时会丢失。实际上,他提出了一个无法回答的问题。
猜你喜欢
  • 2012-12-25
  • 2012-04-09
  • 2011-09-08
  • 2012-11-04
  • 1970-01-01
  • 1970-01-01
  • 2010-10-20
相关资源
最近更新 更多