当我完成排序链表时,我不确定如何摆脱循环

时间:2012-10-20 03:55:43

标签: java sorting loops linked-list

所以我要做的是对链表进行排序。我坚持打破它似乎永远不会逃脱的循环。从示例中我发现我所要做的就是检查下一个值是否为空,那么我做错了什么?

另外,由于我无法弄清楚为什么这不会制动出循环,这段代码是否应该正确地进行链表排序?

    public void sortFirst() { 
        do
        {
            if (first.iData >= first.next.iData)
            {
                int iTempData = first.iData;
                double dTempData = first.dData;

                first.iData = first.next.iData;
                first.dData = first.next.dData;

                Link newLink = new Link(iTempData, dTempData);
                newLink.next = first;
                first = newLink;
            }
        }
        while (first.next != null);
    }   

1 个答案:

答案 0 :(得分:1)

嗯,砰的一声,你的最后3行有一个逻辑问题:

            Link newLink = new Link(iTempData, dTempData);
            newLink.next = first;
            first = newLink;

在这里,您设置newLink.next = first。因此它不是空的。接下来设置first = newLink。所以你可以很快看到first.next永远不会为null。

从循环中我可以看出,你实际上并没有在列表中移动节点, 但只有节点内的数据。在这种情况下,您只需要移动数据:

            int iTempData = first.iData;
            double dTempData = first.dData;

            first.iData = first.next.iData;
            first.dData = first.next.dData;

            first.next.iData = iTempData;
            first.next.dData = dTempData;

(并删除创建新节点的最后3行并将其错误地插入列表中)。 当然,这有点难看。链接列表的酷炫之处在于您只需在列表中移动节点,就可以执行以下操作:

    current = head;
    prev = null;
    while( current != null && current.next != null ){
        next = current.next;

        if( current.iData > next.iData ) {
            // need to swap nodes
        if( prev == null ) {
            // special head case
            head = next;
            current.next = head.next;
            head.next = current;
            }
        else
        {
            prev.next = next;
            current.next = next.next;
            next.next = current;
        }
    }

    // increment pointer
    prev = current;
    current = current.next;
}