使用递归反向链表

时间:2011-09-23 08:28:16

标签: c++

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

请在这里建议我做错了什么。

由于

2 个答案:

答案 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之后处理所有节点。因为我们想要在最后打印当前节点,所以不需要前进指针。