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



,所以我要做的是对链接列表进行排序。我陷入了突破循环中,似乎永远不会逃脱。从示例中,我发现我要做的就是检查下一个值是否为null,所以我做错了什么?

另外,由于我不知道为什么这不会从循环中刹车,因此该代码似乎应该正确地排序链接列表?

    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);
    }   

好吧,在蝙蝠上,您在最后3行中有一个逻辑问题:

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

在这里,您将NewLink.Next =首先设置。因此,它不是零。接下来,您将首先设置= newlink。因此,您可以快速看到第一。

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

            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;
}

最新更新