2016-09-15 4 views
1

私片方向リンクリストを反転させるための単一リンクリストを逆にするための再帰的な方法?

http://www.geeksforgeeks.org/write-a-function-to-reverse-the-nodes-of-a-linked-list/

に(C言語)この再帰的なプログラムを見てきました。プログラムでこのステップで

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;} 

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

は私が書くことができます "REST->次=最初;" の代わりに "初段>ネクスト>次=最初;"?

「first-> next-> next = first;」と書くことの意義はありますか?

+0

http://stackoverflow.com/questions/37725393/reverse-linked-list-recursively – BLUEPIXY

答えて

0

さて、あなたはその変更を試みたとき何が起こったのですか? のコースを書くことはできますが、セマンティクスは変更される可能性があります。

first->nextrestに割り当てても、常に同じになることはありません。あなたの直前の声明は、からrestへのポインタをrecursiveReverseに渡します。要するに、restと変更する予定です。

restは、の逆のリストの残りの部分を指しているはずです。これはもうfirst->nextではありません。今度は、逆リストのエンドになります。restがそのリストの先頭です。

これで十分に説明できますか?そうでない場合は、それぞれの場合にあなたのプログラムが何をしているかを説明するために、いくつかの印刷文を入れてください。

+1

Cは参照渡しがありません。 'rest'への*ポインタ*は値渡しですが、これは同じものではありません。しかし、 'rest'の値が呼び出し側で変更される可能性は同じです。 –

+0

「あなたは何を考えますか」おそらく、それが他の多くの分野でこのように機能するという事実:機能プログラミングと数学など。副作用のある機能があるかどうかは、直感的ではありません。答えをあまり控えめな形で書き直してください。 –

関連する問題