2016-07-05 17 views
0
void recursiveReverse(struct node** head_ref) 
{ 
struct node* first; 
struct node* rest; 

/* empty list */ 
if (*head_ref == NULL) 
    return; 

/* suppose first = {1, 2, 3}, rest = {2, 3} */ 
first = *head_ref; 
rest = first->next; 

/* List has only one node */ 
if (rest == NULL) 
    return; 

/* reverse the rest list and put the first element at the end */ 
recursiveReverse(&rest); 
first->next->next = first; 

/* tricky step -- see the diagram */ 
first->next = NULL;   

/* fix the head pointer */ 
*head_ref = rest;    
} 

上記のコードは再帰的にリンクリストを逆転させるためのコードです。私はプログラムを理解しましたが、最後に* head_ref = rest;私を混乱させている。私はそれを詳しく説明しましょう。リンクリストを逆転させるための再帰的解答

>の1-の例を見てみましょう2 - > 3

in first recursion: first=1, rest=2 
in second recursion: first=2, rest=3 
in last recursion: first=3, rest=null 

と、その時点から、我々は戻って、各ステップで私たちが割り当て* headRef = が最終的に私たちは私たちの最初のステップで戻ってきて休みます残りは2であり、私達は* headRef = 2 を割り当てるが、我々は

私を助けてください、私はアドレスを印刷してみました私は、私はここで何かをしないのです確信しているが、私はこの問題を解決することができませんでした3ない2 に、残りのポイントが必要最初と残りのimage shows that after recursion, address of rest doesn't change

ありがとうございます。

上記のコードはgeeksforgeeksのものです...私はコメントしましたが、誰も私を助けませんでした。

http://imgur.com/Dfb46xD

答えて

0

restポインタのアドレスが再帰呼び出しで渡されることに注意してください。

再帰から戻るときに、restポインタが 'remaining-list'の 'new'開始点を指すように変更されます。

これは、あなたの例では、各逆方向再帰ステップでrestが要素3を指すように変更されることを意味します。

+0

私は理解していません...私はこれを紙に書いています。あなたはここからhttp://imgur.com/Dfb46xDを見ることができます。そこに私は疑いを明確に述べました。私が理解するのを助けてください... –

+0

あなたはそこに私がK1、K2、K3、K4がアドレスであり、残りのアドレスの末尾に '0'が追加されていることを見ることができます –

+0

@LokeshSあなたの図で* head_refはK4再帰から戻った後、Rest2は* head_ref3 = rest2というK4を指します。 * head_ref3 = K4を入力してください。 –

関連する問題