反向链表崩溃混乱

时间:2017-10-17 09:17:55

标签: c++ linked-list reverse

我通常不会发出一个问题,问一下代码有什么问题,但我有点困惑,并且没有看到下面的函数失败的原因。

我正在编写一个反转链表的函数。第一个函数ReverseList1()导致运行时错误,并在使用驱动程序代码main()进行测试时崩溃。

第二个函数ReverseList2(),使用指向指针的指针作为head参数正常工作。为什么,它仍然指向相同的数据?也许我错过了一些明显和关键的东西,但我看不到它。提前谢谢。

////第一个功能/////

void ReverseList1(struct Node* head, struct Node* prev, struct Node* next)
{
    // not valid list
    if (head == NULL)
    {
        return;
    }

    struct Node* cur = head;

    while(cur != NULL)
    {
        next = cur->next;
        cur->next = prev;
        prev = cur;
        cur = next;
    }
    head = prev;
}

////////第二个功能 - 使用此////

时不会崩溃
void ReverseList2(struct Node** head, struct Node* prev, struct Node* next)
{
    // not valid list
    if (head == NULL)
    {
        return;
    }

    struct Node* cur = *head;

    while(cur != NULL)
    {
        next = cur->next;
        cur->next = prev;
        prev = cur;
        cur = next;
    }
    *head = prev;
}

//////要测试的驱动程序代码//////

int main()
{
    struct Node* head= new struct Node;
    head->data = 1;

    head->next = new struct Node;
    head->next->data = 2;

    head->next->next = new struct Node;
    head->next->next->data = 3;

    head->next->next->next = new struct Node;
    head->next->next->next->data = 4;

    head->next->next->next->next = NULL;

    //ReverseList1(head, NULL, NULL); // Runtime error
    ReverseList2(&head, NULL, NULL)

    cout<<head->data<<endl;
    cout<<head->next->data<<endl;
    cout<<head->next->next->data<<endl;
    cout<<head->next->next->next->data<<endl;
    return 0;
}

1 个答案:

答案 0 :(得分:1)

  

使用指向指针而不是head参数正常工作。为什么,它仍然指向相同的数据

不,它没有指向相同的数据。指针指向节点。指向指针的指针指向指向节点的指针。

当您为函数指定本地的指针变量时,它对函数外部的任何变量都没有影响。通过不将不是局部变量的头指针更新到函数,算法的实现是不完整的。

当您取消引用指向不是局部变量的对象的指针时,分配该解除引用的对象确实会对该对象产生影响。