无限循环使用while

时间:2013-05-29 15:10:06

标签: java infinite-loop

嘿,我有一个程序使用while循环,但我真的很困惑为什么它变成无限循环

这是我的代码

print void

public void print() {
    DoublyLinkedListNode current = first;
    while (current != null) {
        current.displayInfo();
        current = current.next;
    }//end while
}//end print


public DoublyLinkedListNode partition(DoublyLinkedList list,
        DoublyLinkedListNode first, DoublyLinkedListNode last) {
    DoublyLinkedListNode smallIndex = first;
    DoublyLinkedListNode index = smallIndex.next;
    DoublyLinkedListNode temp = new DoublyLinkedListNode();
    double pivot = first.ipk;
    while (index != temp.next) {
        if ((index.ipk) < pivot) {
            smallIndex = smallIndex.next;
            temp.ipk = index.ipk;
            index.ipk = smallIndex.ipk;
            smallIndex.ipk = temp.ipk;
        }
        index = index.next;
    }
    temp.ipk = first.ipk;
    first.ipk = smallIndex.ipk;
    smallIndex.ipk = temp.ipk;
    System.out.println("The list in partition is: ");
    list.print();
    System.out.print("\n");
    return first;
}

public void recQuickSort(DoublyLinkedList list, DoublyLinkedListNode first,
        DoublyLinkedListNode last) {
    while (first != last) {
        DoublyLinkedListNode pivotLocation = partition(list, first, last);
        recQuickSort(list, first, pivotLocation.back);
        recQuickSort(list, pivotLocation.next, last);
    }
}

主要

public static void main(String[] args) {
    DoublyLinkedList d = new DoublyLinkedList();
    d.insertNode("Apep", "123", 3.5);
    d.insertNode("Alex", "121", 3.2);
    d.insertNode("Kujul", "124", 3.1);
    d.insertNode("Fahmi", "125", 3.7);
    d.print();
    d.quickSort(d);
    d.print();
}

所以从这些代码中会有无限循环输出,我不知道哪个来自我的程序,使其无限循环。谢谢。

2 个答案:

答案 0 :(得分:6)

嗯,快速浏览一下,while (first != last)上有一个循环,然后你不会重新分配其中一个变量。请记住,!=检查引用相等性(“这些是完全相同的对象”)而不是逻辑相等(根据Object.equals(Object)方法)。因此,如果first != last进入该循环,您将永远不会退出该循环。

以前在while (index != temp.next)循环中发生了类似的事情。

如果你有一个调试器,我会逐步尝试自己找出无限循环的位置。如果您尚未学习如何使用调试器,那么现在是学习的好时机。如果你还没有时间,你可以回到经过时间考验的技巧,在各个地方打印出调试行(System.out.println("here!"))。我相信他们中的一个会开始说“这里!这里!这里!这里!”并准确地告诉你你在无限循环中的位置。

答案 1 :(得分:0)

我看到你的链接列表是一个双向链表。不知何故,您的任何内部节点next都拥有对您之前访问过的任何其他内部节点的引用。

如果它是这样的话,那么只有你的while可以进入无限循环而问题出现在代码的其他部分。