关于链表,这两种方法有什么不同?C++中的1个自变量与2个自变量

What is different in these two approaches regarding Linked Lists? 1 argument vs 2 arguements in C++

本文关键字:自变量 C++ 1个 2个 什么 中的 链表 于链表 方法 两种      更新时间:2023-10-16

这段代码插入到链表的尾部,当头节点不为空时,即它已经指向某个链表时,它可以完美地工作。

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是对调用函数时使用的原始变量的引用