【发布时间】:2021-05-21 03:16:29
【问题描述】:
我试图反转一个链接列表,但我一直遇到一个问题。我终于发现是错误的并修复了它,但是我不明白为什么我的最后一种方法不起作用。下面的代码是成功反转链表的代码。
void reverse_list(list** head)
{
list* currNode = *head;
list* prevNode = NULL;
list* tmpNode;
while(1)
{
tmpNode = currNode->next;
currNode->next = prevNode;
if(tmpNode == NULL)
{
*head = currNode;
break;
}
prevNode = currNode;
currNode = tmpNode;
}
}
但是,下面的代码不起作用。两者都使用双指针,但在这一次中,我取消了对 head 的两次引用以获取实际对象并用 *currNode 分配它。当我运行这段代码时,它最终进入一个无限循环并且它丢失了最后一项。例如,如果项目是 1,2,3,4,5,那么反过来就是 5,4,3,2,它会继续打印相同的列表。我不明白为什么这种方法不起作用,因为我正在访问实际对象(通过取消引用两次)并为其分配一个新对象(*currNode)。
void reverse_list(list** head)
{
list* currNode = *head;
list* prevNode = NULL;
list* tmpNode;
while(1)
{
tmpNode = currNode->next;
currNode->next = prevNode;
if(tmpNode == NULL)
{
**head = *currNode;
break;
}
prevNode = currNode;
currNode = tmpNode;
}
}
下面的代码与上面的代码有相同的问题。我采用了与上面代码相同的方法,只是这个使用了一个指针。
void reverse_list(list* head)
{
list* currNode = head;
list* prevNode = NULL;
list* tmpNode;
while(1)
{
tmpNode = currNode->next;
currNode->next = prevNode;
if(tmpNode == NULL)
{
*head = *currNode;
break;
}
prevNode = currNode;
currNode = tmpNode;
}
}
任何帮助理解这一点将不胜感激。谢谢!
【问题讨论】:
-
这是C代码还是C++代码?
list到底是什么?
标签: c linked-list reverse singly-linked-list function-definition