C程序使用递归来反转堆栈

时间:2014-05-25 04:49:33

标签: c recursion data-structures linked-list tail-recursion

我遇到了以下函数来使用递归来反转堆栈。我对它的运作方式感到困惑。

请帮助我以更简单的方式理解。

void stack_reverse(struct node **head, struct node **head_next)
{
    struct node *temp;

    if (*head_next != NULL)
    {
        temp = (*head_next)->next;
        (*head_next)->next = (*head);
        *head = *head_next;
        *head_next = temp;
        stack_reverse(head, head_next);
    }
}

2 个答案:

答案 0 :(得分:4)

我已经为您评论了代码,这可以帮助您了解每行的功能。如果您仍然遇到问题,那么我强烈建议您阅读指针及其工作原理。关于指针here的教程。

void stack_reverse(struct node **head, struct node **head_next)
{ 
    // Make a temp node.
    struct node *temp;

    // Check if head_next is not null.
    if (*head_next != NULL)
    {
        // Make temp point to the next element of head_next.
        temp = (*head_next)->next;

        // Make next of head_next point to the head.
        (*head_next)->next = (*head);

        // Make head point to head_next.
        *head = *head_next;

        // Make head_next point to temp.
        *head_next = temp;

        // Call the same function again until you are done.
        stack_reverse(head, head_next);
    }
}

答案 1 :(得分:2)

检查每次迭代时headhead_next的值如何变化应该有助于理解函数的工作原理。

迭代开始:

*head: NULL
*head_next: a -> b ->  c -> d -> NULL

首先致电stack_reverse()

temp = (*head_next)->next;    // temp:       b -> c -> d -> NULL
(*head_next)->next = (*head); // *head_next: a -> NULL
*head = *head_next;           // *head:      a -> NULL
*head_next = temp;            // *head_next: b -> c -> d -> NULL

第二次致电stack_reverse()

temp = (*head_next)->next;    // temp:       c -> d -> NULL
(*head_next)->next = (*head); // *head_next: b -> a -> NULL
*head = *head_next;           // *head:      b -> a -> NULL
*head_next = temp;            // *head_next: c -> d -> NULL

第三次致电stack_reverse()

temp = (*head_next)->next;    // temp:       d -> NULL
(*head_next)->next = (*head); // *head_next: c -> b -> a -> NULL
*head = *head_next;           // *head:      c -> b -> a -> NULL
*head_next = temp;            // *head_next: d -> NULL

第四次致电stack_reverse()

temp = (*head_next)->next;    // temp:       NULL
(*head_next)->next = (*head); // *head_next: d -> c -> b -> a -> NULL
*head = *head_next;           // *head:      d -> c -> b -> a -> NULL
*head_next = temp;            // *head_next: NULL

递归结束。