0

重複の可能性:
リンクリストの再帰的逆

SOで質問を検索し、リンクを取得しました

再帰スタックトレース

head_refがどのように4を指しているのかわかりませんか?

誰かが私がこれを理解するのを手伝ってもらえますか?

4

1 に答える 1

0

わかりました、まず第一に、それはここで午前6時です、そして私は一晩中眠ることができませんでした...だからこれはでたらめかもしれません;)...しかしここに行きます:

「魔法」は次の場所で発生しrecursiveReverse(&rest);ます...&は、パラメーターがRESTのアドレスであることを示します... Rest自体がポインターであるため、パラメーターはポインターへのポインターです...

関数が終了すると、ポインターが変更され、反転されたサブリストの最初の要素(4ノード)を指します...

元:

したがって、リスト1-> 2-> 3-> 4がありrecursiveReverse(struct node** head_ref)、head_refパラメーターとして1ノードへのポインターへのポインターを使用して呼び出したとします。

したがって、head_refが特定のアドレス(私はAと呼んでいます)にあるとしましょう

head_refはポインタへのポインタです...したがって、アドレスAの値は別のアドレスです(それをBと呼びましょう)

したがって、Bに格納されている「もの」はポインタです...したがって、Bの値もアドレスです(そのアドレスをCと呼びましょう)。

最後に、Cに格納されている「もの」は私たちの構造体です...

これを念頭に置いて、最初の再帰呼び出しを行いますrecursiveReverse(struct node** head_ref)...今回はパラメータは&restです...&restは2ノードへのポインタへのポインタです...

詳細を見てみましょう...&restの値はアドレスです...(推測するのは難しいですが、これをDと呼びます)... Dの値はアドレス(2ノードのアドレス)です。 E

再帰呼び出しが終了した後、サブリスト2-> 3-> 4が逆になり(4-> 3-> 2)、アドレスの1つが新しい値で更新されました...Dが更新されました、およびアドレスEを保持しなくなりますが、4ノードのアドレスを保持します(必要に応じてFと呼びます...)

これで、ポインタ「first」が1ノードを指し、次のポインタがまだ2ノードを指しているようになりました...したがってfirst->next->next = first、を使用して、2ノードの「next」ポインタを修正し、 1ノード..。

1ノードが2ノードを指さなくなったためfirst->next=NULL、完全なリストが逆になりました...

戻り値がないため、ポインタパラメータhead_refへのポインタによって逆リストを返します...*head_ref = rest

restはポインタです...アドレスDにあります...Dの現在の値はF(4ノードのアドレス)です

したがって、Dの値(4ノードのアドレスであるF)をアドレスB(* head_ref)に書き込みます。

これが、4ノードへのポインタが返される方法です。

于 2012-09-14T04:21:09.793 に答える