我正在尝试使用递归来反转链接列表。我为此编写了一个函数“reverse(node * ptr)” 我的输出为40 40 20,而我预计输出为40,20,10。 以下是发布的代码。
class list {
//some code;
void reverse()
{
node* temp = new node;
temp =first;
reverse(temp);
temp =NULL;
delete temp;
}
void reverse(node* ptr) {
if(ptr->next != NULL)
{
ptr =ptr->next;
reverse(ptr);
}
cout << ptr->data << endl;
}
// some code;
};
int main()
{
list ll;
ll.insert(18);
ll.insert(20);
ll.insert(40);
ll.display();
ll.reverse();
return 0;
}
请在这里建议我做错了什么。
由于
答案 0 :(得分:1)
在讨论链接列表之前,您的代码存在一个主要问题:
void reverse()
{
node* temp = new node;
temp =first;
reverse(temp);
temp =NULL;
delete temp;
}
您为node
分配空间,然后将其指向的内容更改为first
。这意味着您分配的内存将被泄露。不仅如此,你然后将其设置为NULL然后尝试释放它。你不能释放NULL!
我相信你的意思是:
void reverse()
{
reverse(first);
}
简单。到链表:
if(ptr->next != NULL)
{
ptr =ptr->next;
reverse(ptr);
}
您将ptr
设置为下一个元素,因此当reverse()
返回时,它将是前面的一个元素。我相信你的意思是:
if(ptr->next != NULL)
{
reverse(ptr->next);
}
答案 1 :(得分:0)
你应该摆脱ptr =ptr->next;
行。
主要目标是在打印当前节点的值之前打印当前节点之后的所有节点。因此,只需调用reverse(ptr->next)
后跟cout<<ptr->data<<endl
即可,因为第一次调用会在ptr
之后处理所有节点。因为我们想要在最后打印当前节点,所以不需要前进指针。