在 C 中递归地从链表中删除元素
Removing Elements From a Linked List Recursively in C
我目前正在通过做老师发布给我们学习的练习题来备考,我正在努力从链表中递归删除元素。我得到一个无限循环,我不太清楚为什么!有人可以提示我正确的方向吗?我已经制作了一种无需递归即可删除元素的方法(在下面发布)并尝试遵循该指南。但是,我似乎无法让我的递归方法起作用。下面是我的代码:
void destroyListRecursive(node *head)
{
if ( head == NULL)
return;
destroyListRecursive(head->next);
free(head);
}
这是我的 none 递归函数(我查看了其他文章以获得指导,因为我遇到了一些问题,如果有问题请告诉我):
void destroyList (struct node** head)
{
struct node* current = *head;
struct node* next;
while (current != NULL)
{
next = current->next;
free(current);
current = next;
}
*head = NULL;
}
这是我的列表结构:
typedef struct node
{
// data field
int data;
// the next node in the list
struct node *next;
} node;
我真的很感激在正确的方向轻推! :)
据我了解,在任何一种情况下都应该释放 head
,并且只有当列表有尾时才应该进行递归调用。此外,还可以涵盖列表为空的情况,从而导致以下实现。
void destroyListRecursive(node *head)
{
if (head != NULL)
{
destroyListRecursive(head->next);
free(head);
}
}
您的代码取消引用链表最后一个元素上的 NULL 指针
if ( head->next == NULL)
return;
当最后一个元素递归传递给函数时,它的值将在 head
参数中,所以
if ( (NULL)->next == NULL)
return;
您的递归函数必须只检查 head
值:
void destroyListRecursive(node *head)
{
if ( head == NULL)
return;
destroyListRecursive(head->next);
free(head);
}
我目前正在通过做老师发布给我们学习的练习题来备考,我正在努力从链表中递归删除元素。我得到一个无限循环,我不太清楚为什么!有人可以提示我正确的方向吗?我已经制作了一种无需递归即可删除元素的方法(在下面发布)并尝试遵循该指南。但是,我似乎无法让我的递归方法起作用。下面是我的代码:
void destroyListRecursive(node *head)
{
if ( head == NULL)
return;
destroyListRecursive(head->next);
free(head);
}
这是我的 none 递归函数(我查看了其他文章以获得指导,因为我遇到了一些问题,如果有问题请告诉我):
void destroyList (struct node** head)
{
struct node* current = *head;
struct node* next;
while (current != NULL)
{
next = current->next;
free(current);
current = next;
}
*head = NULL;
}
这是我的列表结构:
typedef struct node
{
// data field
int data;
// the next node in the list
struct node *next;
} node;
我真的很感激在正确的方向轻推! :)
据我了解,在任何一种情况下都应该释放 head
,并且只有当列表有尾时才应该进行递归调用。此外,还可以涵盖列表为空的情况,从而导致以下实现。
void destroyListRecursive(node *head)
{
if (head != NULL)
{
destroyListRecursive(head->next);
free(head);
}
}
您的代码取消引用链表最后一个元素上的 NULL 指针
if ( head->next == NULL)
return;
当最后一个元素递归传递给函数时,它的值将在 head
参数中,所以
if ( (NULL)->next == NULL)
return;
您的递归函数必须只检查 head
值:
void destroyListRecursive(node *head)
{
if ( head == NULL)
return;
destroyListRecursive(head->next);
free(head);
}