c++ - 如果 head 在 main 中本地声明,则链表的 void 递归反向函数的参数应该是什么?
问题描述
我正在尝试实现链表的递归反转。除了提供 node* 指针作为参数之外,我还应该提供什么作为参数?
这个函数是当 head 在 main 中本地声明时。当全局声明 head 时,我成功实现了这个函数,因为我们不需要显式传递 head 的地址(因为它可以在函数内部访问)。
#include<bits/stdc++.h>
using namespace std ;
struct node{
int data ;
node* link ;
};
void insert(int n, node** head)
{
node* temp = new node() ;
temp->link = NULL ;
temp->data = n ;
if(*head == NULL)
{
*head = temp ;
}
else
{
node* ptr = *head ;
while(ptr->link != NULL)
{
ptr = ptr->link ;
}
ptr->link = temp ;
}
}
void print(node* ptr)
{
while(ptr != NULL)
{
cout<<ptr->data<<" " ;
ptr = ptr->link ;
}
}
void reverse(node* ptr, node** hptr)
{
node* temp = *hptr ;
if(ptr->link == NULL)
{
*hptr = ptr ;
return ;
}
ptr = ptr->link ;
reverse(ptr, &temp) ; //Line 10: Here is the main doubt. I want to write an equivalent of &head instead of &temp to pass the original address of head.
node* q = ptr->link ;
q->link = ptr ;
ptr->link = NULL ;
}
int main()
{
node* head = NULL ; //local head declaration
insert(5,&head) ;
insert(6,&head) ;
insert(7,&head) ;
insert(8,&head) ;
reverse(head,&head) ;
cout<<endl ;
print(head) ;
}
当链表为 5->6->7->8 时,我打印这个链表时没有错误,也没有打印任何内容。预期的答案是 8->7->6->5 。如何纠正第 10 行或代码中的任何其他错误?
带全局头的代码:
#include<iostream>
using namespace std ;
struct node{
int data ;
node* link ;
};
node* head ;
void reverse(node* ptr) //pointer to node
{
if((ptr->link) == NULL) //exit condition
{
head = ptr ;
return;
}
else
{
reverse(ptr->link) ;
node* q = ptr->link ; //temp variable that points to the adjacent(right) node of ptr
q->link = ptr ;
ptr->link = NULL ;
}
}
void print(node* ptr)
{
if (ptr == NULL)
{
return ;
}
else
{
cout<<ptr->data<<" " ;
ptr = ptr->link ;
print(ptr) ;
}
}
int main()
{
head = NULL ;
for(int i=0;i<4;i++)
{
node* temp = new node() ;
temp->link = NULL ;
temp->data = i ;
if(head == NULL)
{
head = temp ;
}
else
{
node* p = head ;
while(p->link != NULL)
{
p = p->link ;
}
p->link = temp ;
}
}
reverse(head) ;
print(head) ;
return 0 ;
}
解决方案
这个版本适合我
void reverse(node* ptr, node** hptr)
{
if (ptr->link == NULL)
{
*hptr = ptr;
return;
}
reverse(ptr->link, hptr);
node* q = ptr->link;
q->link = ptr;
ptr->link = NULL;
}
ptr = ptr->link;
上面版本的问题是递归调用之前的赋值。加上对头指针的错误处理。
推荐阅读
- c# - 如何将精灵旋转 90°
- apache-spark - 如何计算 Spark 集群或 MPI 集群中的数据通信成本和工作负载平衡率?
- json - 处理包含数组或值的 JSON 属性
- python - 为什么 list() 和 [] 之间的 getsizeof 有不同的结果
- php - laravel中从一个函数到另一个函数的变量
- python - 如何通过 Selenium 和 Python 将文本发送到搜索字段
- android - 在 Marshmallow+ 中使用窗口管理器在锁定屏幕上显示文本视图
- sql-server - SQL SUBSTRING from ntext field only text before and after
- rspec - 为什么“不要在诸如 `before` 之类的钩子中使用 `expect`”?
- python - 在 csv 文件中打印信息