使用递归的反向链接列表

reverse link list using recursion

本文关键字:链接 列表 递归      更新时间:2023-10-16

我正在尝试使用递归反转链接列表。我为此写了一个函数"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;
}

请告诉我哪里做错了。

谢谢

在讨论链表之前,您的代码存在一个主要问题:

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);
}

你应该去掉ptr =ptr->next;行。

主要目标是在打印当前节点的值之前打印当前节点之后的所有节点。因此,简单地调用reverse(ptr->next)然后调用cout<<ptr->data<<endl应该就足够了,因为第一次调用会处理ptr之后的所有节点。不需要移动指针,因为我们想在末尾打印当前节点。