Pointers 为什么在使用递归反转链表时会发生无限循环

Pointers 为什么在使用递归反转链表时会发生无限循环,pointers,recursion,data-structures,linked-list,heap,Pointers,Recursion,Data Structures,Linked List,Heap,我是数据结构的初学者。假设我有一个包含5个元素的链表。我正在编写以下代码以使用递归反转链表: void reverse (node* p) { if (p->next == NULL) { head = p; return; } reverse (p->next); node* q = p->next; q->next = p; p->next = NULL; } 在上面的代码

我是数据结构的初学者。假设我有一个包含5个元素的链表。我正在编写以下代码以使用递归反转链表:

void reverse (node* p)
{
    if (p->next == NULL)
    {
        head = p;
        return;
    }
    reverse (p->next);
    node* q = p->next;
    q->next = p;
    p->next = NULL;
}
在上面的代码中,头节点最初作为参数传递。这段代码运行良好;但问题是我们为什么要使用这条线路

p->next = NULL;

如果我没有添加这一行,它将成为一个无限循环。但是,即使没有添加该行,p->next也会在下面的堆栈展开中被分配上一个节点的地址。那么,如果不添加该行,为什么会导致无限循环呢?

这不是您应该如何进行此练习的。这不是你真正应该做的事情(改变一个没有传递到函数中的变量),把它想象成一个军队应征入伍者。每个人都面向东方。如果你让他们转过脸来,那么第一个人(最西边的人)将不得不面对任何人。这就是那条线。删除该行会使第一个节点(现在是最后一个)仍然面对第二个节点(现在是倒数第二个)。@alvits:仍然在以下堆栈展开中发生更改我认为您忘记了函数的初始项将是最后一个返回的项。记住这一点,如果不将
p->next
设置为
NULL
,它应该指向哪里?列表中的最后一个节点不应该指向
NULL
以指定列表的结尾吗?记住,函数的初始条目是处理头部节点,该节点在退出时成为尾部节点。这是最后一个退出的。