C++ 链表头双指针传递
我在一些书/教程中看到过这一点 将(链表的)头指针传入函数时,需要将其作为双指针传递 例如: //这是为了反转头指向第一个节点的链接列表C++ 链表头双指针传递,c++,c,linked-list,reverse,double-pointer,C++,C,Linked List,Reverse,Double Pointer,我在一些书/教程中看到过这一点 将(链表的)头指针传入函数时,需要将其作为双指针传递 例如: //这是为了反转头指向第一个节点的链接列表 void nReverse(digit **head) { digit *prev=NULL; digit *curr=*head; digit *next; while(curr!=NULL) { next=curr->next; curr->next=prev;
void nReverse(digit **head)
{
digit *prev=NULL;
digit *curr=*head;
digit *next;
while(curr!=NULL)
{
next=curr->next;
curr->next=prev;
prev=curr;
curr=next;
}
*head=prev;
return;
}
这个很好用
当我使用单指针时它也能工作,比如
void nReverse(digit *head)
{
digit *prev=NULL;
digit *curr=head;
digit *next;
while(curr!=NULL)
{
next=curr->next;
curr->next=prev;
prev=curr;
curr=next;
}
head=prev;
return;
}
我试着用头指针打印列表。这两个函数都工作得很好
我错过什么了吗
谢谢,最后一个
head=prev代码>不会更改第二个示例中传递的指针的值。此函数是否需要该行取决于您。但这是有区别的
你是如何测试它“运行良好”的?您是否能够迭代列表并打印出节点的值,并看到它们实际上已被反转?第一个函数(大概叫做代码< nRead(& list);<强>更改< <代码> >列表> /Cord>,第二个不这样(因此第二个如何知道哪个节点是列表的开始,毕竟它只是被改变了)…< /P> < P>这是非常类似C的代码,而不是C++ + < /P>
基本上,当通过值传递某些内容时,函数会对数据的副本进行操作:
void foo(int i)
{
i = 5; // copy is set to 5
}
int x = 7;
foo(x);
// x is still 7
在C语言中,您可以传递一个指向变量的指针,并通过这种方式进行更改:
void foo(int* i)
{
*i = 5; // whatever i points to is set to 5
}
int x = 7;
foo(&x);
// x is 5
对于您来说,它不是一个int
,而是一个数字*
(导致指向指针的指针)
C++中引用了引用,引用是另一个对象的别名,所以你会做这样的事情:
void foo(int& i) // i is an alias to another value
{
i = 5; // x is set to 5
}
int x = 7;
foo(x); // pass x as alias, not address of x.
// x is 5
通常首选引用,因为它强制您实际引用对象,并简化调用和操作代码
<>当然,在C++中,你自己不会实现一个列表,你会使用<代码> STD::列表< /C> > < P>在第一个例子中,你所通过的仍然指向列表的“开始”。
在第二个示例中,它指向列表的末尾(开始时是列表的开头,但后来移动了)。双间接寻址的原因是,nReverse
可以修改调用方的指针,因为在反转列表后,列表的头现在是一个不同的节点
在第二个版本中,您正在修改函数本地的
head
副本,因此调用方仍然有一个对旧head节点的引用,该节点现在是尾部。双指针传递的原因(第一个示例)是您要更改列表的标题。由于您正在反转列表,因此在完成反转后,标题应指向列表的最后一个元素
digit* list;
// initialize list
nReverse(&list);
// now list is pointing to the last element of the chain (and not the first)
如果不使用双指针,则list仍将指向原始的第一个元素,而下一个元素将指向NULL,因为它是反转后的最后一个元素。因此,您将丢失所有其他元素。BTW:如果函数返回
void
,则它的最后一行不必是返回;
。您可能需要一个@虽然这是对一般情况的好建议,但这个人显然是在做一个学习练习。在这种情况下,使用“预先完成”的解决方案是没有帮助的。谢谢。我在我的标签中提到,我正在使用C++。在同一本书中找到了答案:有没有好的在线资源来学习C和C++之间的这些差异?@约翰:它们是两种不同的语言。C++作为C的扩展开始,但实际上是剩下的,有些C保持了泛化和语法。网上学习资源通常会失败,你会希望从上面链接的页面中找到一本好的C++书籍来正确地学习C++。(顺便说一下,如果您觉得答案解决了您的问题,请单击答案旁边的复选标记。)嘿,谢谢。我刚想出来:)是的。在同一本书中找到答案:)