首先,我建议您使用nullptr
而不是 NULL。
然后,进入您的代码。您实际上并没有从列表中删除任何内容。
if(n->next == NULL)
{
Node *tmp = new Node();
^^^^^^^^^^
//Useless, and dangerous. This memory is never free'd
tmp = n;
int val = n->value;
tmp = NULL;
^^^^^^^^^^
//You just set a local variable to NULL, you're not deleting anything
return val;
}
如果要删除节点,则必须保留对前一个节点的引用(例如,有一个双向链表,即在每个节点中都有一个指向下一个元素的指针和一个指向前一个元素的指针,或者直接在前一个节点上工作)。
将此前一个节点设置next
为nullptr
,存储节点的值,然后删除Node
指针。
一种方法是使用指向下一个节点的指针:
int LinkedList::removeTailRec(Node *n)
{
//EDIT: Adding a check for n validity
if(!n){
//Here, you should have a way of detecting
//a call to your method with a null pointer
return 0;
}
Node* nextNode = n->next;
// check for the base case(s)
if(nextNode->next == nullptr)
{
//Get the next node value
int val = nextNode->value;
//Set the current node next member to nullptr
n->next = nullptr;
//Free the last node
delete nextNode;
return val;
}
else{
return removeTailRec(n->next);
}
// else call the recursive method
}