C ++ reversePrint链接列表递归

时间:2014-09-02 07:19:36

标签: c++ recursion

这里是reversePrint功能:

void SinglyLinkedList::reversePrint(Node* p)
{
    if (p == NULL) {
        return;
    } else {
        reversePrint(p->next);
        cout << p->data << " ";
    }
}

(即:list = 1 -> 2 -> 3 -> 4,print out = 4 3 2 1

仅当*p最初指向*head指向的内容,即第一个节点1时,它才有效。但是,Node* head是SinglyLinkedList类的私有成员,因此可以&#39;在课外访问。如何将a pointer的{​​{1}}从head传递到main

这就是我所说的:

int main() {
  SinglyLinkedList *list = new SinglyLinkedList();
  list->addNode(1);
  list->addNode(2);
  list->addNode(3);
  list->addNode(4);

  Node* p = head;  // <---- Xcode says: Use of undeclared identifier 'head'
  list->reversePrint(p);
  return 0;
}

我尝试将*p指向*head方法中reversePrint指向的内容。但是,它破坏了递归

class SinglyLinkedList {

public:
    // constructor
    SinglyLinkedList();

    // destructor
    ~SinglyLinkedList();

    // public APIs
    void print();
    void addNode(int number);
    void reversePrint(Node* p);

private:
    Node* head;
};

3 个答案:

答案 0 :(得分:5)

  1. 将使用Node*的成员函数移至private部分。

  2. 创建一个不接受任何输入的public成员函数。使用private成员函数实现它。

    void SinglyLinkedList::reversePrint()
    {
       this->reversePrint(this->head);
    }
    
  3. 在调用函数中没有public的情况下调用Node*成员函数。

    list->reversePrint();
    

答案 1 :(得分:3)

您可以定义一个不带参数的公共方法,另一个私有方法使用从public方法调用的参数。例如

public:
   void reversePrint() const { reversePrint( head ); } 
private:
   void reversePrint(Node* p) const { /*...*/ }

答案 2 :(得分:1)

void SinglyLinkedList::reversePrint(const Node* p) const设为私有,

并添加一个调用void SinglyLinkedList::reversePrint() const的公共重载reversePrint(head)

或者,您可以将吸气剂添加到head