可能重复:
链表递归反向
我在 SO 上搜索了我的问题并获得了链接
我不明白 head_ref 是如何指向 4 的?
谁能帮我理解这一点?
好的,首先,现在是早上 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 节点的指针的方式