这有点愚蠢,但我无法真正解释为什么会发生这种情况。作为练习,我想反转单链表,我通过定义方法来做到这一点:
class solution {
void reverseLinkedList(Node*& head) {
Node* curr = head;
Node* prev = NULL;
while (curr != NULL) {
Node* _next = curr->next;
curr->next = prev;
prev = curr;
curr = _next;
}
head = prev;
}
在我的主要功能中,我拨打电话
solution s;
s.reverseLinkedList(head);
Node* iterator = head;
while (iterator != NULL) {
std::cout<<iterator->data<<std::endl;
iterator = iterator->next;
}
我之前定义了指向某个链表的头指针。 while 循环用于打印我的链接列表,该函数可以完成它的工作。这仅在我通过引用传递头节点后才起作用;我最初尝试在开始时传递 Node* head 而不是 Node*& head,它只打印我的链表的第一个元素(并且不反转它)。例如,如果我没有通过引用传递列表 1->2->3,我将只打印 1。
我认为传递一个指针就足够了?为什么我在没有通过引用传递的情况下得到如此奇怪的行为>
C++ 中的局部变量(存储在堆栈中)具有块作用域,即在执行定义它们的块后,它们将超出作用域。
当您将指针传递给函数时,将创建该指针的副本,并且该副本就是传递的内容。一旦函数被执行,函数工作区中的变量就会超出范围。在函数内创建的任何非静态自动变量都将被销毁。
当您通过引用传递时,您不会传递变量的副本,而是传递实际变量,因此对变量所做的任何更改都会反映在传递给函数的实际变量上(通过引用)。
我想指出的是,指向下一个节点的指针存储在内存中,并且有一个指向其存储位置的地址。因此,如果您不想通过引用传递,可以这样做:
- 使用指向指针的指针,该指针指向存储下一个节点的指针变量(地址)的内存位置
- 将 this 传递给函数(不是通过引用)
- 取消引用指针并存储您想要指向的新地址。
我知道这有点令人困惑,但是请查看这段将节点添加到链表的小代码。
void addNode(Node** head, int newData)
{
Node* newNode = new Node;
newNode->data = newData; // Can also be done using (*newNode).data
newNode->next = *head;
*head = newNode;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)