我遇到了以下函数来使用递归来反转堆栈。我对它的运作方式感到困惑。
请帮助我以更简单的方式理解。
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);
}
}
答案 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)
检查每次迭代时head
和head_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
递归结束。