我已经编写了这段代码,以便在链接列表中找到一组数字的最小值。
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;
}
}
答案 0 :(得分:1)
你的循环应该检查curr != null
。否则你最终可能会得到NullPointerException
。
您的比较应该相反(curr.getElement()
应小于temporaryMinimum
以便替换它。)
当您找到新的最低要求时,您应该修改temporaryMinimum
。
如果您的DLNode
类应该是通用的,则无法将T
投射到Integer
。您可以要求T extends Comparable<T>
,这样您就可以使用compareTo
代替>
或<
。
哦,如果你仍然得到一个无限循环,也许你的链表是循环的(即最后一个节点的getNext()返回第一个节点)。没看到你的DoublyLinkedList
课,我无法确定。
while (curr != null) {
if (curr.getElement() != null) {
if (temporaryMinimum.compareTo(curr.getElement()) > 0) {
min = curr;
temporaryMinimum = curr.getElement();
}
}
curr = curr.getNext();
}