如何使用一次通过引用变量来反转链表
How to reverse a linked list using one pass by reference variable?
我试图用递归(不是迭代)来反转链表。最初,我设置我的头指针作为一个全局变量,所以我不需要返回头。这个版本工作得很好,所以我想实现一个将head作为局部变量的版本。代码如下:
void Reverse(node* &head, node *p)
{
if(p == NULL) return; //nothing in list
if(p->link == NULL)
{
head = p;
return;
}
Reverse(head, p->link);
node *q = p->link;
q->link = p;
p->link = NULL;
}
//some code to set local var head to a linked list
Reverse(head, head);
它工作得很好,但是看起来很麻烦。我已经尝试了一些方法来做它只有一个变量,但它不起作用。
void Reverse(node* &head)
{
if(head == NULL) return;
node *p = head;
if(p->link == NULL)
{
head = p;
return;
}
Reverse(p->link);
node *q = p->link;
q->link = p;
p->link = NULL;
}
//some code to set local var head to a linked list
Reverse(head);
Print(head); //output only last element in list
有没有其他的方法来实现它只有一个通过引用变量传递?另外,你能解释一下为什么第二个代码输出是这样的吗?谢谢!编辑:所以这似乎不是一个很好的方法。所以我能想到的最后一种方法是通过值参数传递并返回结果(假设head是本地的)。我试着这样实现它:
node* Reverse(node *p)
{
if(p == NULL) return p; //nothing in list
if(p->link == NULL)
{
return p;
}
Reverse(p->link);
node *q = p->link;
q->link = p;
p->link = NULL;
//control may reach end of non-void fucntion
}
,但我不能想到一种方法来绕过"控制可能达到非空函数的结束"的问题。任何帮助吗?
一个简单的解决方案:您可以在Reverse
中调用您的第一个函数:
void Reverse(node *&head) {
Reverse(head, head); //may want to rename or make private
}
相关文章:
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 多个"常量引用"变量可以共享同一个内存吗?
- 如果非动态变量被指针引用,何时超出范围?
- 在 c++ 中将变量作为结构构造函数中的引用传递
- 在 gtest 中初始化堆栈上的引用变量的隔离错误
- 为什么C++可以使用未初始化的成员变量(引用或指针 *NOT 值复制*)来初始化其父类的成员变量
- 地址运算符是否返回变量引用的对象的地址
- 未在另一个函数中设置变量引用的问题
- 英特尔样式内联程序集和 AT&T 样式中的变量引用,C++
- 将成员变量引用为类成员
- 从静态变量引用非静态变量会使非静态变量先于静态变量进行析构函数
- 何时解析 C++11 lambda 表达式中的变量引用
- 堆栈/堆变量的变量/引用名称或类型存储在内存中的位置
- C++强制对变量引用进行编译优化,使之成为直接的
- Boost变量引用和相等比较
- 使复制的成员引用变量引用副本的成员,而不是原始成员的成员
- 为什么要在Java中生成变量引用数组
- 捕获和调试对移动lambda内部局部变量引用的无效使用
- 在变量初始化后更改变量引用
- 从'C'程序中提取变量定义和变量引用