指点

时间:2016-09-10 22:21:41

标签: c++ pointers

以下内容旨在撤销链接列表。它似乎工作,直到它到达最后一行。当我调试时,"当前"和"结果"属于同一类型(节点*)和"结果"是逆转的名单。但是当函数完成时,current只有" result"的第一个值。名单。任何人都知道为什么"当前"函数完成后不是完整列表?

struct Node {
   int data;
   Node* next;
};

void reverseList(Node** head)
{
    Node* current = *head;
    Node* result = NULL;

    while (current != NULL)
    {
        Node* temp = current;
        current = temp->next;
        temp->next = result;
        result = temp;
    }

    current = result;
}

2 个答案:

答案 0 :(得分:3)

显示的逻辑存在多个问题。

我们可以从显而易见的观察开始,reverseList的目标显然是扭转单链表。

第二个观察是该函数采用单个参数,一个指向头节点的指针,并返回void

从中,我们得出结论,该函数应该更新head节点,但代码中没有任何内容可以执行此操作。

此外,实际上没有理由为什么这个函数应该采用像这样的双指针,指向头节点的指针,并更新它。函数将一个普通指针带到列表的第一个元素,现有的head指针,然后返回反转列表的head指针,这简单得多了。

通过这种简单的改变,得到的逻辑变得更短,更简单:

Node *reverseList(Node *head)
{
    Node *current=NULL;

    while (head)
    {
        Node *next=head->next;

        head->next=current;
        current=head;

        head=next;
    }
    return current;
}

就是这样。

答案 1 :(得分:2)

您需要在算法结束时更新头部:

current = result;
*head = current;