c++ - 为什么这两个不同的反向双链表?
问题描述
要反转双向链表,这两个代码有什么区别?和改变next和previous指针不一样吗?
void reverse(Node **head_ref)
{
Node *temp = NULL;
Node *current = *head_ref;
while (current != NULL)
{
temp = current->prev;
current->prev = current->next;
current->next = temp;
current = current->prev;
}
if(temp != NULL )
*head_ref = temp->prev;
}
void reverse(Node **head_ref)
{
Node *temp = NULL;
Node *current = *head_ref;
while (current != NULL)
{
temp = current->next;
current->next; = current->prev;
current->prev = temp;
current = current->next;
}
if(temp != NULL )
*head_ref = temp->next;
}
解决方案
当您交换两个引用时,您确实可以选择从哪一个开始,即将哪个复制到temp
变量中。
所以以下两段代码成功实现了交换:
temp = current->prev;
current->prev = current->next;
current->next = temp;
并且(如果您删除了中途的分号):
temp = current->next;
current->next = current->prev;
current->prev = temp;
但是,您的第二个代码块应该像第一个代码块一样继续。您必须点击prev
链接(与交换之前的next
链接一样)。所以在第二个版本中你应该改变:
current = current->next;
至:
current = current->prev;
尽管如此,第二个代码中的问题是,在每次迭代结束时,您的temp
引用等于current
引用,并且在循环退出时将为空。这样就无法在循环退出后正确设置头指针。
所以你真的应该坚持第一个版本。
推荐阅读
- typescript - 为逻辑参数声明一个自定义类型
- python - 根据特定的列过滤条件从 s3 存储桶中选择 s3 parquet 文件
- python - 为什么在递归函数中将 1 添加到列表剪切 [1:]
- pip - 当依赖项出错时如何安装kivy
- flutter - 无法通过颤振中的 SearchDelegate 类传递用户数据
- angular - 关于在错误输入时隐藏和显示错误消息的问题
- javascript - 在 chart.js 中设置仪表的起始值
- javascript - 无法在 React 功能组件中将 onclick 添加到 svg 路径
- html - Capybara 需要 Cucumber 场景 Ruby Rails Application Codio Web_steps
- java - 使用 void 的 JUnit 测试