C++ 递归查找链表中的最小数

C++ 递归查找链表中的最小数,c++,list,recursion,linked-list,C++,List,Recursion,Linked List,我试图在我创建的一个链表中找到最低的值,我需要递归地找到这个值,关于如何去做有什么想法吗 这是我的头球 // Header file for the IntList class #ifndef INTLIST_H #define INTLIST_H #include <iostream> class IntList { private: struct ListNode // Used for nodes { int

我试图在我创建的一个链表中找到最低的值,我需要递归地找到这个值,关于如何去做有什么想法吗

这是我的头球

// Header file for the IntList class

#ifndef INTLIST_H
#define INTLIST_H

#include <iostream>

class IntList
{
    private:
        struct ListNode // Used for nodes
        {
            int value;
            ListNode * next;
        };
        ListNode * head; // Address of the 1st node
        int sum, high_value;
        int lowValues(ListNode *);
    public:
        IntList();                  //Constructor
        IntList(IntList &);         //Copy constructor
        void appendNode(int);       //Adds a new node to end of list
        void insertNode(int);       //Inserts a num into list
        void deleteNode(int);       //Deletes a num from list
        void displayList() const;   //Displays list
        int sumList();              //Returns sum of list
        int highValue();            //Finds highest value in the list
        ***int lowValue(ListNode *)    //Finds low value using recursion***
        { return lowValue(head); }
        ~IntList();                 //Destructor
};
//IntList类的头文件
#ifndef INTLIST_H
#定义INTLIST_H
#包括
类内部列表
{
私人:
结构ListNode//用于节点
{
int值;
ListNode*下一步;
};
ListNode*head;//第一个节点的地址
整数和,高_值;
int低值(ListNode*);
公众:
IntList();//构造函数
IntList(IntList&);//复制构造函数
void appendNode(int);//将新节点添加到列表的末尾
void insertNode(int);//在列表中插入一个num
void deleteNode(int);//从列表中删除一个num
void displayList()const;//显示列表
int sumList();//返回列表的和
int highValue();//查找列表中的最高值
***int lowValue(ListNode*)//使用递归查找低值***
{返回低值(头);}
~IntList();//析构函数
};
高级草图:

  • 如果我是列表中的最后一个元素,请将自己作为“最低”返回
  • 否则,返回较小的我和“列表的其余部分”
这就是本质。如果你在写作中遇到困难,请告诉我们你在哪里遇到困难。

高级草图:

  • 如果我是列表中的最后一个元素,请将自己作为“最低”返回
  • 否则,返回较小的我和“列表的其余部分”

这就是本质。如果你写的文章写得不好,请告诉我们你在哪里被卡住。< /P> < P>不要在C++中滚动你自己的链接列表。标准库中有两个-std::list是双链接列表,std::forward_list是单链接的。还有一种标准算法可以在一个范围内找到最小元素:

std::list<int> intList = {1, 2, 3};

int minimum = *(std::min_element(std::begin(inList), std::end(intList)));
std::list intList={1,2,3};
最小整数=*(std::min_元素(std::begin(inList),std::end(intList));

我看到list类存储的信息比list多,但通过使用此算法和标准容器,您根本不需要类。当然,除非这是编写链表类的作业;)

>不要在C++中滚动自己的链表。标准库中有两个-std::list是双链接列表,std::forward_list是单链接的。还有一种标准算法可以在一个范围内找到最小元素:

std::list<int> intList = {1, 2, 3};

int minimum = *(std::min_element(std::begin(inList), std::end(intList)));
std::list intList={1,2,3};
最小整数=*(std::min_元素(std::begin(inList),std::end(intList));

我看到list类存储的信息比list多,但通过使用此算法和标准容器,您根本不需要类。当然,除非这是编写链表类的作业;)

您的低值如下所示

int lowValues(ListNode *n){
if(n!=NULL){
int k=lowValues(n->next);
return (k<n->value)?k:n->value;
}
}
int低值(ListNode*n){
如果(n!=NULL){
int k=低值(n->next);
返回值(kvalue)?k:n->value;
}
}

这主要是C代码,但它可以工作

您的低值如下所示

int lowValues(ListNode *n){
if(n!=NULL){
int k=lowValues(n->next);
return (k<n->value)?k:n->value;
}
}
int低值(ListNode*n){
如果(n!=NULL){
int k=低值(n->next);
返回值(kvalue)?k:n->value;
}
}
<>这主要是C代码,但它工作

(我可能会用生锈的C++使自己难堪,但其症结是语言不可知论,所以要点应该是可理解的)。 (我假设
head
在这两种情况下都不为空,主要是因为我不知道在空列表的情况下要做什么。任何一种方法都可以在
lowValue
的开头捕捉到这一点)

更快、更安全、更简单。递归之所以伟大,是因为递归思维往往比迭代思维更容易解决问题,但编译器无法始终将其转化为迭代版本,因此如果问题有一个自然的迭代解决方案,使用递归未免过早悲观

(至少在命令语言中;在一些声明性语言中,递归是一种更自然的方法,更可能是优越的或甚至是唯一的方法)。

(我可能会用生锈的C++使自己尴尬,但其症结是语言不可知论,所以要点应该是可理解的)。 (我假设

head
在这两种情况下都不为空,主要是因为我不知道在空列表的情况下要做什么。任何一种方法都可以在
lowValue
的开头捕捉到这一点)

更快、更安全、更简单。递归之所以伟大,是因为递归思维往往比迭代思维更容易解决问题,但编译器无法始终将其转化为迭代版本,因此如果问题有一个自然的迭代解决方案,使用递归未免过早悲观


(至少,在命令式语言中;在某些声明式语言中,递归是一种更自然的方法,更有可能是更好的方法,甚至可能是唯一的方法)。

除非编译器设法撤消递归,递归给您带来的只是性能下降和堆栈溢出的风险,而迭代版本中不存在这种风险。听起来像是家庭作业。@user1920482啊。我想这是有道理的。关于递归的教育性练习似乎总是挑选一些例子,在这些例子中,出于某种原因,递归是一个坏主意。对列表进行排序是可取的。@ThomasMatthews对它进行排序可能是O(n ln),而仅仅查找它(无论是迭代还是递归)可能是O(n)。因此,除非排序列表有进一步的用途,否则排序将是一种浪费。除非编译器设法撤消递归,否则递归给您带来的是性能下降和堆栈溢出的风险,而迭代版本中不存在这种风险。听起来像是家庭作业。@user1920482啊。我想这是有道理的。预计起飞时间