gpt4 book ai didi

c++ - 如果 head 在 main 中局部声明,链表的 void 递归反向函数的参数应该是什么?

转载 作者:行者123 更新时间:2023-11-28 04:12:15 24 4
gpt4 key购买 nike

我正在尝试实现链表的递归反转。除了提供 node* 指针作为参数外,我还应该提供什么作为参数?

这个函数是在main中局部声明head的时候。我在全局声明 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++ - 如果 head 在 main 中局部声明,链表的 void 递归反向函数的参数应该是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57444729/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com