以下内容旨在撤销链接列表。它似乎工作,直到它到达最后一行。当我调试时,"当前"和"结果"属于同一类型(节点*)和"结果"是逆转的名单。但是当函数完成时,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;
}
答案 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;