找到不起作用的双向链表中的最小元素

时间:2017-11-12 12:10:19

标签: java doubly-linked-list

我已经编写了这段代码,以便在链接列表中找到一组数字的最小值。

public DLNode<T> getMinimum() {
    if (isEmpty()) {
        return null;
    }
    DLNode<T> curr = head;
    DLNode<T> min = curr;
    T temporaryMinimum = head.getElement();
    while (curr.getElement() != null) {
        if ((Integer) temporaryMinimum < (Integer) curr.getElement()) {
            min = curr;
        }
        curr = curr.getNext();
    }
    return min;
}

我正在使用此代码块测试它

public static void getMinElement(){
    int[] data = {2, 3, 5, 1, 6};
    //Add elements to the list from array data
    DoublyLinkedList<Integer> ll = new DoublyLinkedList<>();

    for (int i = 0; i < data.length; i++) {
        ll.AddLast(data[i]);
    }

    System.out.println("Size: " + ll.size);

    System.out.println("Minimum Element is: " + ll.getMinimum());

}

在main中调用如此:

getMinElement();

它不会抛出任何错误,但它似乎进入无限循环或某事(根据我的机器上每次启动它时使用了多少CPU)。

我想指出我的IDE(IntelliJ IDEA)没有显示任何错误或警告不受控制的循环或类似的东西。 过去几天我一直在推理它,没有任何运气,我现在已经没有想法了。

非常感谢任何帮助。

编辑:我的DLNode类是:

class DLNode<T> {
    DLNode<T> Element;
    T data;
    DLNode<T> next;
    DLNode<T> prev;

    DLNode(T data, DLNode<T> next, DLNode<T> prev) {
        this.data = data;
        this.next = next;
        this.prev = prev;
    }

    T getElement() {
        return data;
    }
    public DLNode<T> getPrev() {
        return prev;
    }
    public void setPrev(DLNode<T> prev) {
        this.prev = prev;
    }
    public DLNode<T> getNext() {
        return next;
    }
    public void setNext(DLNode<T> next) {
        this.next = next;
    }
}

1 个答案:

答案 0 :(得分:1)

  1. 你的循环应该检查curr != null。否则你最终可能会得到NullPointerException

  2. 您的比较应该相反(curr.getElement()应小于temporaryMinimum以便替换它。)

  3. 当您找到新的最低要求时,您应该修改temporaryMinimum

  4. 如果您的DLNode类应该是通用的,则无法将T投射到Integer。您可以要求T extends Comparable<T>,这样您就可以使用compareTo代替><

  5. 哦,如果你仍然得到一个无限循环,也许你的链表是循环的(即最后一个节点的getNext()返回第一个节点)。没看到你的DoublyLinkedList课,我无法确定。

    while (curr != null) {
        if (curr.getElement() != null) {
            if (temporaryMinimum.compareTo(curr.getElement()) > 0) {
                min = curr;
                temporaryMinimum = curr.getElement();
            } 
        }
        curr = curr.getNext();
    }