0

可能重复:
链表递归反向

我在 SO 上搜索了我的问题并获得了链接

递归堆栈跟踪

我不明白 head_ref 是如何指向 4 的?

谁能帮我理解这一点?

4

1 回答 1

0

好的,首先,现在是早上 6 点,我整晚都无法入睡……所以这可能是胡说八道;)……但我们开始吧:

“魔术”发生在recursiveReverse(&rest);...... & 表示参数是rest的地址......因为rest本身是一个指针,我们的参数是一个指向指针的指针......

当函数完成时,指针已更改,并指向反向子列表的第一个元素(即 4 节点)...

前任:

所以假设我们有我们的列表 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 节点的地址),我们称之为乙

递归调用完成后,子列表 2 -> 3 -> 4 已反转(4 -> 3 -> 2),我们的其中一个地址已更新为新值... D 已更新,并且不再包含地址 E,而是 4 节点的地址(如果需要,请调用该 F ...)

所以现在,我们有指针“first”指向 1-node,它的 next-pointer 仍然指向 2-node...所以first->next->next = first,我们更正 2-nodes“next”指针,指向1节点...

因为 1 节点不再指向 2 节点,所以我们有了first->next=NULL,现在完整的列表已经颠倒了......

因为我们没有返回值,所以我们通过指向指针参数 head_ref ... 的指针返回我们的反向列表*head_ref = rest

rest是一个指针……它位于地址 D……D 的当前值是 F(4 节点的地址)

所以我们把D的值(也就是F,4节点的地址)写入地址B(就是*head_ref)

这就是返回指向 4 节点的指针的方式

于 2012-09-14T04:21:09.793 回答