关于链表,这两种方法有什么不同?C++中的1个自变量与2个自变量
What is different in these two approaches regarding Linked Lists? 1 argument vs 2 arguements in C++
这段代码插入到链表的尾部,当头节点不为空时,即它已经指向某个链表时,它可以完美地工作。
void Insert(node *head,int x)
{
if (head==NULL)
{
head=new node;
head->key=x;
head->next=NULL;
}
else
{
link=head;
while (link->next!=NULL)
{
link=link->next;
}
link->next=new node;
link->next->key=x;
link->next->next=NULL;
}
}
对于代码的第一部分,如果头节点是Null(最初是Null),我只需在节点中放入数据和指针。
当它不为null时,"链接"节点从列表的开头开始,一直遍历到尾部,我在其中放入节点。
下面的这段代码只需要一个函数,在所有情况下都能工作。为什么?head等于NULL,并且在这两种情况下都是全局定义的。
void insert(int x)
{
if (head==NULL)
{
head=new node;
head->key=x;
head->next=NULL;
}
else
{
link=head;
while (link->next!=NULL)
{
link=link->next;
}
link->next=new node;
link->next->key=x;
link->next->next=NULL;
}
}
注意:这不是作业或家庭作业或任何相关内容。我只是想学习有关链接列表的基本知识,这是我在Hacker Rank上做一些事情时遇到的问题。
如果有人对显示功能感兴趣:
void display()
{
node *trav=head;
while (trav!=NULL)
{
cout<<trav->key;
trav=trav->next;
}
}
结构已在我的程序中定义。
struct node
{
int key;
node *next;
}
为了方便起见,我已经在全局范围内定义了头指针,但只要稍微调整一下,我就可以改变这一点。我想。此外,"链接"也是全球性的,以防有人混淆它来自哪里。
node *head = NULL;
node *link = NULL;
总之,问题是:
当head为NULL时,为什么它在一个参数中有效,而在两个参数版本中无效。
在第一个函数中,将head
作为参数传递,然后按值传递参数。这意味着函数head
内部是调用函数时传递的值的副本,修改副本不会修改原始副本。
您需要通过引用传递参数,这在C++中声明参数时使用"与"号(&
)很容易做到:
void Insert(node *& head,int x) { ... }
// ^
// Note ampersand here
这告诉编译器head
是对调用函数时使用的原始变量的引用。
相关文章:
- 以代数表达式中的数字和单位作为自变量的文字
- 为什么相对于右值引用参数,右值引用自变量更喜欢常量左值引用
- 关于链表,这两种方法有什么不同?C++中的1个自变量与2个自变量
- C++方法内每个对象的自变量
- 在C++中,如何将相同的操作应用于一组自变量
- x*x != x*x 在自变量中
- 如果指针是函数自变量并且通过引用传递值,我应该删除它吗
- 将2D数组作为自变量传递给采用1D数组的函数
- 作为自变量的右值引用和左值引用之间的差异
- 特征向量4d作为函数自变量
- 我们如何计算旋转和平移两个立体相机在opencv StereoRectify(r,t自变量)中使用
- 一个函数可以接收两个自变量吗?每个自变量来自两个不同的函数
- 为什么volatile局部变量的优化与volatile自变量不同,以及为什么优化器会从后者生成无操作循环
- _stdcall、C++/内联ASM中的变量自变量