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++。(顺便说一下,如果您觉得答案解决了您的问题,请单击答案旁边的复选标记。)嘿,谢谢。我刚想出来:)是的。在同一本书中找到答案:)