递归地反转没有全局变量的链表

时间:2015-12-11 15:44:38

标签: c++ linked-list

我想知道为什么传递第二个参数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);
}

3 个答案:

答案 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;
  }
}