通过递归反转链表的困惑?

时间:2012-09-13 14:08:09

标签: recursion linked-list

  

可能重复:
  Linked list recursive reverse

我在SO上搜索了我的问题并得到了一个链接

recursion stack trace

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

有人能帮助我理解这个吗?

1 个答案:

答案 0 :(得分:0)

好的,首先,现在是早上6点,我整晚都睡不着......所以这可能是废话;)......但是我们走了:

“魔法”发生在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节点的指针