我已经在
中看到了这个递归程序(用C语言编写)http://www.geeksforgeeks.org/write-a-function-to-reverse-the-nodes-of-a-linked-list/
用于反转单链表。
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-> next = first; "而不是" first-> next-> next = first; " ?
或者写作是否有任何意义? first-> next-> next = first; " ?
答案 0 :(得分:0)
那么,当你尝试改变时发生了什么? course 你可以写它......但是语义可能会改变。
将first->next
分配给rest
不会强制它们始终相同。您之前的语句将指针传递给rest
recursiveReverse
。简而言之,您期望 rest
进行更改。
rest
现在应该指向颠倒列表的其余部分的头部。这不再是first->next
;现在应该是反向列表的 end ,其中rest
是该列表的头部。
这能解释得好吗?如果没有,请在几个打印陈述中说明您的程序在每种情况下的作用。