リンクされたリストを 1-> 2 -> 3 ->4 とします。
cの関数は--
struct linked_node * reverse_recursive(struct linked_node * head)
{
struct linked_node * first;/*stores the address of first node of the linked
list passed to function*/
struct linked_node * second;/* stores the address of second node of the
linked list passed to function*/
struct linked_node * rev_head;/*stores the address of last node of initial
linked list. It also becomes the head of the reversed linked list.*/
//initalizing first and second
first=head;
second=head->next;
//if the linked list is empty then returns null
if(first=NULL)
return(NULL);
/* if the linked list passed to function contains just 1 element, then pass
address of that element*/
if(second==NULL)
return(first);
/*In the linked list passed to function, make the next of first element
NULL. It will eventually (after all the recursive calls ) make the
next of first element of the initial linked list NULL.*/
first->next=NULL;
/* storing the address of the reverse head which will be passed to it by the
condition if(second==NULL) hence it will store the address of last element
when this statement is executed for the last time. Also here we assume that
the reverse function will yield the reverse of the rest of the linked
list.*/
rev_head=reverse(second);
/*making the rest of the linked list point to the first element. i.e.
reversing the list.*/
second->next=first;
/*returning the reverse head (address of last element of initial linked
list) . This condition executes only if the initial list is 1- not empty
2- contains more than one element. So it just relays the value of last
element to higher recursive calls. */
return(rev_head);
}
リンクされたリスト 1-> 2-> 3 -> 4 の関数を実行中
- reverse(&1) 内では、コードは rev_head=reverse(&2); まで実行されます。// ここで &1 は 1 のアドレスです。
関数のリストは
1(最初)->2(2番目) -> 3 -> 4
reverse(&2) 内のコードは rev_head=reverse(&3); まで実行されます。関数のリスト
2(最初)->3 (2番目)-> 4
reverse(&3) 内のコードは rev_head=reverse (&4); まで実行されます。関数
3(1 つ目)-> 4 (2 つ目)の場合のリスト
reverse(&4) 終了条件の中で second==NULL が真なので return を実行して 4 のアドレスを返します。
機能一覧
4(1番目)-> NULL(2番目)
- back to reverse(&3) 関数のリストは
NULL<-3 (最初) 4 (2番目)
で、返された rev_head=&4 の値
second->next=first; を実行した後。リストになります
NULL<- 3(1 回目) <-4 (2 回目)
戻ります (rev_head ); rev_head=&4 であるため、&4 を渡すと実行されます
関数内のリストは
NULL<-2(最初) 3(秒)<-4
rev_head は rev(&3) によって返された &4 です。
second->next=first を実行すると、リストは次のようになります
NULL<-2(1 回目)<-3(2 回目)<-4
戻ります (rev_head); &4 を rev(&1) に返すが実行されます。
関数内のリストは
NULL<-1(最初) 2(秒)<-3<-4
rev_head の値は、reverse(&3) によって渡された &4 です。
今 second->next =first が実行され、リストは次のようになります
NULL<-1(1 回目) <- 2(2 回目)<-3<-4
戻ります (rev_head); が実行されます // rev_head=&4 は reverse(&2) によって返され、rev_head の値がメイン関数に渡されます。
お役に立てれば。これを理解し、この回答を書くのにもかなりの時間がかかりました。