2

だから私がやろうとしているのは、リンクリストをソートすることです。私はそれが決して逃げないように見えるループから抜け出すことに固執しています。例から、次の値が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);
    }   
4

1 に答える 1

1

さて、すぐに、最後の3行に論理的な問題があります。

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

ここでは、newLink.next=firstを設定します。したがって、nullではありません。次に、最初に=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;
}
于 2012-10-20T03:58:46.700 に答える