递归链表反转

时间:2018-05-20 08:48:34

标签: c pointers linked-list

此代码来自this site.

void recursiveReverse(struct Node** head_ref)
{
    struct Node* first;
    struct Node* rest;

    /* empty list */
    if (*head_ref == NULL)
       return;   

    /* suppose first = {1, 2, 3}, rest = {2, 3} */
    first = *head_ref;  
    rest  = first->next;

    /* List has only one node */
    if (rest == NULL)
       return;   

    /* reverse the rest list and put the first element at the end */
    recursiveReverse(&rest);
    first->next->next  = first;  

    /* tricky step -- see the diagram */
    first->next  = NULL;          

    /* fix the head pointer */
    *head_ref = rest;              
}

我不明白为什么在最后一次递归调用后,rest的值仍然相同?我理解 recursiveReverse(& rest)正在传递休息的实际地址,但是这个地址不是仅由head_ref获取的吗?这意味着每个递归调用都有自己的第一个和休息的本地副本,因此 * head_ref = rest 不应该工作,因为rest的值会不断变化。

我的理解在哪里出错?

编辑:添加一些我的涂鸦。

enter image description here

1 个答案:

答案 0 :(得分:0)

  

我不明白为什么在最后一次递归后调用rest的值   保持不变?

它命中递归调用的基本情况并立即返回。

 /* List has only one node */
    if (rest == NULL)
       return;  
  

每个递归调用都有自己的第一个和其余的本地副本吗?

是的,确切地说。 See how it works.

  

*head_ref = rest不应该起作用,因为休息的价值会不断变化。

没有。它最终指向链表的最后一个元素,它将是第一个元素我的意思是最右边的节点(在未更改的列表中)将被指向。