重複の可能性:
リンクリストの再帰的逆
SOで質問を検索し、リンクを取得しました
head_refがどのように4を指しているのかわかりませんか?
誰かが私がこれを理解するのを手伝ってもらえますか?
わかりました、まず第一に、それはここで午前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ノードへのポインタが返される方法です。