我想知道为什么传递第二个参数Node** fhead
会导致段错误? Node
的值为int
,下一个指针指向下一个Node
。
这是我的代码:
void reverse(Node* head, Node** fhead) {
if (!head->next)
{
fhead = &head;
return;
}
reverse(head->next, fhead);
head->next->next = head;
head->next = 0;
}
int main()
{
Node a = {1, 0};
Node b = {2, &a};
Node c = {3, &b};
Node** fhead;
reverse(&c, fhead);
}
答案 0 :(得分:1)
你在recurssion终止时有一点错误。您应该将*fhead
设置为head
,而不是将其分配给&head
(这将在函数中本地更改fhead
):
if (!head->next)
{
*fhead = head;
return;
}
答案 1 :(得分:0)
有两个非常小但很严重的问题。
首先,
fhead = &head;
为参数指定一个值,以便在函数外部不会看到更改。
这与
完全相同void f(int x)
{
x = 0;
}
就像你通过时一样指向int
,
void f(int* x)
{
*x = 0;
}
您需要指定指针指向的对象:
*fhead = head;
其次,您需要将有效指针传递给变量:
Node* fhead = 0;
reverse(&c, &fhead);
(初始化不是绝对必要的,但初始化变量是一个好主意。)
通过这两项更改,您的代码将按预期工作。
答案 2 :(得分:0)
public ListNode reverseList(ListNode head) {
if (head == null || head.next == null)
return head;
ListNode p = reverseList(head.next);
head.next.next = head;
head.next = null;
return p;
}
可以假定ListNode定义
class ListNode{
int val;
ListNode next;
public ListNode(int val){
this.val = val;
this.next = null;
}
}