【问题标题】:Finding the even and odd numbers in a linked list by recursion?通过递归查找链表中的偶数和奇数?
【发布时间】:2013-01-01 08:30:32
【问题描述】:

祝大家新年快乐! :)

我可以在今年的第一天做得更好,但我正在尝试一起实现链表和递归。

我只是想如何编写一个函数,用递归计算链表中的偶数。

void List:: findingEvens(Node* n, Node*& newHead){
    if(n  == NULL)
        return;
    else
        if(n-> data % 2 != 0)
            findingEvens(n-> next);
    else{
        if(!newHead){
            newHead = n;
        }
        else{
             Node* temp =head;
             for(;temp->next;temp=temp->next){
                temp = temp -> next;
              }
             temp-> next = n;
             findingEvents(n-> next);
        }
    }  
}

问题是在我的 h 类中,我应该添加以下内容

void findingEvens(Node* n);

但是,这让我出错,说错误:'Node' has not been declared 实际上我在 h 类中定义了这个函数之后有一个 Node 结构。

递归函数的实现有错吗? 任何帮助将不胜感激,再次新年快乐:)

【问题讨论】:

  • 在最后一个else 子句中,它从不与n->data 做任何事情。您需要保存找到的号码,然后在 n->next 上递归。
  • 哦,是的,没错,但是我如何存储 n -> 数据,是创建新列表的方式吗?实际上我想做给定链表中的所有事情。
  • 两种方法: 1)取第二个列表作为参数,将找到的数字添加到其中。 2)从基本情况返回一个空列表,偶数情况将找到的数字添加到递归调用返回的列表中并返回,奇数情况只是从递归调用返回列表。
  • 嗨@Barmar,我对这段代码做了一些修改,你能评论一下吗?

标签: recursion linked-list


【解决方案1】:
void List:: findingEvens(Node* n, Node*& newHead){
    if(n  == NULL)
        return;
    else
        if(n-> data % 2 != 0)
            findingEvens(n-> next, newHead);
    else{
        // Push even node onto newHead list
        newNode = new Node;
        newNode->data = n->data;
        newNode->next = newHead;
        newHead = newNode;
        findingEvens(n-> next, newHead);
    }
}

你需要在递归调用中传递newHead

您不能直接将n 分配给newHead,因为newHead 列表将包含原始列表中的所有链接。您需要创建新节点并复制数据。

上面的代码以与原始列表相反的顺序构建结果列表,例如如果您以1, 2, 3, 5, 6, 8, 9 开头,则结果将为8, 6, 2。完成后,您可以反转列表。

【讨论】:

  • 所以你总是在头前添加?我是真的吗?
  • 是的,它就是这样做的。添加到列表的末尾很复杂,因为您必须在列表中搜索末尾,或者使用另一个带有指向末尾的指针的变量。您也可以使用向量来保存结果,而不是链表。
  • 哦,我实际上在我试图添加到最后的这段代码中看到了?它不起作用吗? for(;temp->next;temp=temp->next) temp = temp -> next; temp-> next = n;
  • 它看起来不对,因为你的缩进(试着记住把{}放在所有东西周围)并且因为你使用了一个不存在的变量head,但我认为当你修复这些东西时就可以了。
  • 而且我在调用主函数时遇到了问题? (Node* n, Node*& newHead) 参数我应该写什么?
猜你喜欢
  • 1970-01-01
  • 2020-11-03
  • 2021-12-28
  • 2017-03-25
  • 2021-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多