我在SO上搜索了我的问题并得到了一个链接
我不明白head_ref是如何指向4的?
有人能帮助我理解这个吗?
答案 0 :(得分:0)
“魔法”发生在recursiveReverse(&rest);
...&说参数是休息的地址...因为休息本身就是一个指针,我们的参数是一个指向指针的指针......
当函数完成后,指针已经改变,并指向反转子列表的第一个元素(即4节点)......
EX:
所以让我们说我们的列表1 - > 2 - > 3 - > 4并调用recursiveReverse(struct node** head_ref)
,指向指向1节点的指针作为head_ref参数
所以我们假设head_ref位于某个地址(我称之为A)
head_ref是指向指针的指针...所以地址A的值是另一个地址(让我们称之为B)
所以存储在B处的“东西”是一个指针......所以B处的值也是一个地址(让我们称之为地址C)
最后,存储在C中的“东西”是我们的结构......
现在考虑到这一点,我们对recursiveReverse(struct node** head_ref)
进行了第一次递归调用...这次我们的参数是& rest ...& rest是指向2节点指针的指针。 ..
让我们仔细看看......& rest的值是一个地址......(很难猜,我们称之为D)... D处的值是一个地址(2-的地址)我们称之为E
的节点 在递归调用完成后,子列表2 - > 3 - > 4已被反转(4 - > 3 - > 2),我们的一个地址已更新为新值... D已更新,并且不再保留地址E,而是4的地址-node(如果你想要调用那个F ......)
现在,我们有指针“first”指向1节点,其下一个指针仍然指向2节点...所以使用first->next->next = first
,我们纠正2节点“下一个“指针,指向1节点......
由于1节点不再指向2节点,我们有first->next=NULL
,现在完整列表已被反转......
因为我们没有返回值,所以我们通过指针参数head_ref ...返回我们的反向列表... *head_ref = rest
rest
是一个指针......它位于地址D ... D处的当前值是F(4节点的地址)
所以我们将D的值(即F,4节点的地址)写入地址B(* head_ref)
这就是返回指向4节点的指针