可能重复:
链表递归反向
我在SO上搜索了我的问题,得到了一个链接
递归堆栈跟踪
我不明白head_ref是怎么指向4的?
有人能帮我理解一下吗?
好吧,首先,这里是早上6点,我整晚都睡不着。。。所以这可能是胡说八道;)。。。但我们来了:
"魔术"发生在recursiveReverse(&rest);
。。。&说参数是rest的地址。。。由于rest本身就是一个指针,我们的param是指向一个指针的指针。。。
当函数完成时,指针已经更改,并指向反向子列表的第一个元素(即4节点)。。。
例如:
假设我们有一个列表1->2->3->4,并用指向1节点的指针作为head_ref参数来调用recursiveReverse(struct node** head_ref)
假设head_ref在某个地址(我称之为a)
head_ref是指向指针的指针。。。所以地址A的值是另一个地址(我们称之为B)
所以存储在B的"东西"是一个指针。。。所以B的值也是一个地址(我们称之为地址C)
最后,存储在C中的"thing"是我们的结构。。。
现在考虑到这一点,我们对recursiveReverse(struct node** head_ref)
进行第一次递归调用。。。这次我们的参数是&休息&rest是指向2节点的指针。。。
让我们仔细看看。。。&rest是一个地址。。。(很难猜测,我们称之为D)。。。D处的值是一个地址(2节点的地址),我们称之为E
递归调用完成后,子列表2->3->4被反转(4->3->2),我们的一个地址被更新为一个新值。。。D已经更新,不再保存地址E,而是4节点的地址(如果你想,可以调用F…)
现在,我们有一个指向1节点的指针"first",它的下一个指针仍然指向2节点。。。因此,使用first->next->next = first
,我们将2节点的"下一个"指针更正为指向1节点。。。
由于1节点将不再指向2节点,我们有了first->next=NULL
,现在完整的列表已经颠倒了。。。
由于我们没有返回值,我们通过指针到指针参数headref来返回反向列表。。。带*head_ref = rest
rest
是一个指针。。。它位于地址D。。。D处的当前值为F(4节点的地址)
因此,我们将D的值(即F,4节点的地址)写入地址B(即*head_ref)
这就是指向4节点的指针返回