0

単一のリンクリストを逆にするのは簡単です。次のコードは正常に機能します。

void reverse_list (SLINK list)
{
    SLINK tmp = list->next; 
    NODE *cur = NULL;
    list->next = NULL;
    for (; NULL != tmp;)    
    {
            cur = tmp;
            tmp = tmp->next;
            cur->next = list->next;
            list->next = cur;
    }
}

循環単一リンクリストを逆にする方法は?これに合わせてコードを調整します

SLINK reverse_list (SLINK rear)
{
    NODE *tag = rear->next;
    SLINK tmp = rear->next;
    NODE *cur = NULL;
    rear->next = NULL;
    for (; NULL != tmp; )
    {
        cur = tmp;
        tmp = tmp->next;
        cur->next = rear;
        rear->next = cur;
    }
    rear = tag;
    return rear;
}

しかし、それは機能せず、この関数を実行した後、循環リストは非循環になるだろうと思いました。実際、それをダンプした後、それはまだ循環リストであることがわかりました。それは私がその中で間違った論理を作っているに違いありません、私に正しく見せてください。

4

3 に答える 3

1

Amit のように、私はあなたのコードの背後にあるアイデアを完全に理解することはできません...しかし、純粋に論理的な観点から、通常のリストを元に戻す方法を既に知っている場合、最善のオプションは、あなたのすべての要素をコピーすることです循環リストを「for」を使用して新しい通常のリストに変換し、最初の要素が現在の要素と等しいときに停止し、コードで新しいリストを回転させて、単一のリンクされたリストを逆にします。

于 2013-05-24T01:49:17.343 に答える
0

単一のリンクされたリストを逆にするためのコードは問題ないとあなたが言う理由がわかりません。私にはそれは間違っているように見えます。行 cur->next = list->next; ループの外側で list->next を NULL に設定しているとしたら、2 番目のノードの次のポインタを NULL に設定しませんか? 最初のノードに行くべきではありませんか?

また、循環リストを反転すると線形リストになると予想したのはなぜですか? 一枚の紙に循環リストを描いた場合、反転はリンク方向で時計回りから反時計回り (またはその逆) のシフトを引き起こすだけです。

循環リストリバースとライナーリストリバースの間の唯一の論理変更は、循環リンクリストの場合、最初のノードの次のポインターを NULL に設定しないことです。

于 2013-01-08T06:49:48.573 に答える
0

ここに 1 つの方法があります。

node *toggle(node *start){

        node *p=NULL;
        node *c=start;
        node *ne=NULL;
        node *e;
        int f=0;
        do{
            ne=c->next;
            c->next=p;
            p=c;
            if(f==0){
                e=p;
                f=1;
            }
            c=ne;
        }while(c!=start);

        start=p;
        e->next=p;
return start;

}

于 2018-03-21T17:40:58.887 に答える