私はCでリンクリストを使って試験を勉強しています。このコードスニペットを自分自身に "批評"しました。私の人生のために、私は残りがどのように逆転されたか理解できません。ここは...それはMr.Nick Parlante(StanfordのCIS図書館)のLinked Listの問題です。 私はMr. Nickのコメントに入れます。 RecursiveReverse()ソリューション再帰を使用してリンクリストを逆転させるコードスニペットを理解するのに役立つ
は、おそらく最も難しい部分は RecursiveReverse(&残りは)残りを逆に実際にはない概念を受け入れています。次に、1つのフロントノードをリストの末尾まで取得するためのトリック があります。どのように トリックが動作するかを確認するために図面を作ってください。
void RecursiveReverse(struct node** headRef) {
struct node* first;
struct node* rest;
if (*headRef == NULL) return; // empty list base case
first = *headRef; // suppose first = {1, 2, 3}
rest = first->next; // rest = {2, 3}
if (rest == NULL) return; // empty rest base case
RecursiveReverse(&rest); // Recursively reverse the smaller {2, 3} case
// after: rest = {3, 2}
first->next->next = first; // put the first elem on the end of the list
first->next = NULL; // (tricky step -- make a drawing)
*headRef = rest; // fix the head pointer
}
私は何が起こっているかを追跡するための試みで無数の図面を作った、と私はちょうどRecursiveRest(&残りは)実際に残りの部分を反転させる方法を理解することはできません。助けてください。私はかなり不満を感じています。私が最終的に得られるのは、より小さな "休息"です。何も逆転しません。 ありがとうございます。
優秀なグラフィック: – sarnold
@sarnoldありがとう:)。私は少し助けになるようにしています:)。 –
ありがとう、先生!私はすでにそれを理解していた。 – Scared