C++ 为什么我需要在链表中返回头+;

C++ 为什么我需要在链表中返回头+;,c++,data-structures,C++,Data Structures,到底为什么我们要放回脑袋 您拥有的链表是一个单链表。它只有next的引用,所以您只能迭代到末尾。如果你有一个指向开始的指针,你可以找到一切,但是如果你有一个指向中间的指针,你就不知道开始 在这个函数中,您正在预结束,这将创建一个新的开始。如果不返回新的开始,则调用函数将不知道该元素 这是至关重要的,因为您正在使用new来分配内存,如果不释放内存,就会出现内存泄漏。除非调用函数具有此指针,否则无法释放它。您拥有的链表是一个单链链表。它只有next的引用,所以您只能迭代到末尾。如果你有一个指向开始的

到底为什么我们要放回脑袋

您拥有的链表是一个单链表。它只有next的引用,所以您只能迭代到末尾。如果你有一个指向开始的指针,你可以找到一切,但是如果你有一个指向中间的指针,你就不知道开始

在这个函数中,您正在预结束,这将创建一个新的开始。如果不返回新的开始,则调用函数将不知道该元素


这是至关重要的,因为您正在使用new来分配内存,如果不释放内存,就会出现内存泄漏。除非调用函数具有此指针,否则无法释放它。

您拥有的链表是一个单链链表。它只有next的引用,所以您只能迭代到末尾。如果你有一个指向开始的指针,你可以找到一切,但是如果你有一个指向中间的指针,你就不知道开始

在这个函数中,您正在预结束,这将创建一个新的开始。如果不返回新的开始,则调用函数将不知道该元素

这是至关重要的,因为您正在使用new来分配内存,如果不释放内存,就会出现内存泄漏。除非调用函数具有此指针,否则无法释放它。

链表(当人们说链表时,通常指单个链表)具有指向下一个节点的链接,而没有指向上一个节点的链接。想象一下,如果你返回一个节点在列表中间,你可以到达下一个和下一个一直到最后,这是很好的。您遇到的问题是,您将无法转到上一个节点,除非您具有指向该节点的链接,这将使其成为双链接列表,或者具有指向列表中第一个节点的指针,该节点将作为起点

在本例中,您将节点推到列表的前面,因此您的代码将上一个头部推到下一个头部,并将新节点作为头部节点

编辑: 应通过引用传递
标题
val
应按值传递。为什么?对于
head
我们需要它的地址,以便我们可以链接到它。对于
val
,如果我们通过引用传递,地址可能会在调用者函数中重复使用,我们不希望数据发生更改。

链表(当人们说链表时,通常指单个链表)有到下一个节点的链接,而没有到上一个节点的链接。想象一下,如果你返回一个节点在列表中间,你可以到达下一个和下一个一直到最后,这是很好的。您遇到的问题是,您将无法转到上一个节点,除非您具有指向该节点的链接,这将使其成为双链接列表,或者具有指向列表中第一个节点的指针,该节点将作为起点

在本例中,您将节点推到列表的前面,因此您的代码将上一个头部推到下一个头部,并将新节点作为头部节点

编辑:

应通过引用传递
标题
val
应按值传递。为什么?对于
head
我们需要它的地址,以便我们可以链接到它。对于
val
如果我们通过引用传递它,地址可能会在调用者函数中重复使用,我们不希望我们的数据发生变化。

您已经告诉您的编译器,您将返回一个带有函数头的
节点*
。您是否尝试不返回头以查看发生了什么情况?
if(tmp==NULL)
注意:在现代
c++
new中,失败时不会返回NULL。它在这里抛出了
std::bad_alloc
示例:不,还没有…我还在学习它,我是数据结构的初学者。如果我编写函数头节点insertthead(NODE*&head,int val),它将返回什么??或者干脆不返回?不完全是…如果您不想在函数中返回任何内容,可以使用
void
关键字作为返回类型。您已经告诉编译器,您将使用函数头返回一个
节点*
。您是否尝试过不返回head以查看会发生什么情况?
if(tmp==NULL)
注意:在现代
c++
new中,失败时不会返回NULL。它在这里抛出了
std::bad_alloc
示例:不,还没有…我还在学习它,我是数据结构的初学者。如果我编写函数头节点insertthead(NODE*&head,int val),它将返回什么??或者干脆不返回?不完全是……如果您不想在函数中返回任何内容,可以使用
void
关键字作为返回类型。但是有pass-by-reference;)顺便说一句,在一个双链接列表(上一个和下一个指针)中,你可以不返回,但这会让其他一切都很痛苦。你的意思是在函数执行后,我需要释放指针回到列表的开头??每次我想插入val或删除,我都需要通过引用传递它,对吗?或者它不会进行更改?不会。只是在您要删除元素或清理列表时。每个新成员都需要有一个相应的delete。但是有pass by reference;)顺便说一句,在一个双链接列表(上一个和下一个指针)中,你可以不返回,但这会让其他一切都很痛苦。你的意思是在函数执行后,我需要释放指针回到列表的开头??每次我想插入val或删除,我都需要通过引用传递它,对吗?或者它不会进行更改?不会。只是在您要删除元素或清理列表时。每一个新的需要有一个相应的删除。我不同意“链表”是“单一链表”的缩写。后者是前者的一种。每次我想插入val或删除val时,我都需要通过引用传递它,对吗?或者它不会改变吗?@dorman我记得当人们说链表时,他们通常指的是单链表在你的答案中,你说的链表是正确的
NODE* InsertAtHead(NODE* &head, int val){
    NODE *tmp = new NODE;

    //create a new node
    if (tmp == NULL)
        exit(1);

    //Initialize the new node
    tmp->data = val;
    tmp->next = NULL;

    //Insert by changing links
    tmp->next = head;
    head = tmp;         //update head
    return head;
}