递归打印列表

3
我将尝试使用递归打印链表中每个节点的数据,但是我得到了越界错误,因此我认为我的递归函数有问题。
以下是头文件:
class List
{
public:
    void print(std::ostream &out) const {}
private:
    Node *head;
    void printList(std::ostream&, const Node*) const;
}

基本上,我是从公共的print函数中调用私有助手函数。以下是这两个函数的代码:

void List::print(std::ostream& out) const
{
    printList(out, head);
}

void List::printList(std::ostream& out, const Node* n) const
{
    if(n->next == NULL) {
        out << n->data << std::endl;
        return;
    }

    out << n->data << std::endl;

    printList(out, n->next);
}

我认为问题在于我的if块中,因为如果没有下一个节点,则需要停止,但是在返回之前也需要打印当前节点中的数据,但由于我已经在printList(out, n->next)的结尾处调用了n->next,那么我是否需要在我的if块中再次这样做呢?

有没有更好的递归方法?这段代码对别人有效吗?我似乎无法使其正常运行。


出于简单起见,我宁愿编写 `void List::printList(std::ostream& out, const Node* n) const { if(n == NULL) { return; }out << n->data << std::endl; printList(out, n->next);}`。 - Jean-François Fabre
你确定在创建节点时将节点的“next”指针初始化为null指针吗?或者至少确保列表中最后一个节点的“next”指针是null指针? - Some programmer dude
在基本情况下,n->next 是否被正确设置为 nullptr?还是一个随机未初始化的地址? - RyanP
递归打印列表有什么意义呢?这样做可能会导致栈溢出,而并没有明显的好处。 - Serge
另外,如果列表为空,而head是一个空指针,会发生什么? - Some programmer dude
显示剩余5条评论
1个回答

5

你需要改变if()语句中的条件。你应该检查当前节点是否为NULL而不是下一个节点。

void List::printList(std::ostream& out, const Node* n) const { 
    if(n == NULL) { 
        return; 
    } 
    out << n->data << std::endl; 
    printList(out, n->next); 
}

有帮助。这样讲更容易理解,哈!谢谢! - WitchKing17

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接