用指针有点小麻烦

Having a little trouble with pointers

本文关键字:小麻烦 指针      更新时间:2023-10-16

下面是用来反转链表的。直到最后一行,它似乎都是有效的。当我调试时,"current"answers"result"都是相同类型的(Node*),"result"是颠倒的列表。但是当函数完成时,current只拥有"结果"列表的第一个值。有人知道为什么当函数完成时"当前"不是完整的列表吗?

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

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

我们可以从一个明显的观察开始,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;
}

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

current = result;
*head = current;