通过递归反转链表时的混乱



可能重复:
链表递归反向

我在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节点的指针返回

的方式

最新更新