Algorithm 在不更改链接列表的情况下向后读取链接列表
给定一个单链表,向后读取该列表。这个问题听起来很简单,但是(!)你不能更改链表的指针,你只能使用3个变量(指针或其他变量),每个单元格都有一个以false开头的bool标志,你可以随意使用Algorithm 在不更改链接列表的情况下向后读取链接列表,algorithm,linked-list,Algorithm,Linked List,给定一个单链表,向后读取该列表。这个问题听起来很简单,但是(!)你不能更改链表的指针,你只能使用3个变量(指针或其他变量),每个单元格都有一个以false开头的bool标志,你可以随意使用 在O(n^2)中很容易做到,但我认为有一个更好的解决方案(可能是O(n)?)。这种递归方法只需在列表上迭代一次。所以它是O(n) 它是如何工作的: 它递归地遍历列表,直到列表结束,并在stackframe上添加methodcall。最后,它打印出最后一个节点,并返回到第二个最后一个方法调用(它通过stackf
在O(n^2)中很容易做到,但我认为有一个更好的解决方案(可能是O(n)?)。这种递归方法只需在列表上迭代一次。所以它是O(n) 它是如何工作的: 它递归地遍历列表,直到列表结束,并在stackframe上添加methodcall。最后,它打印出最后一个节点,并返回到第二个最后一个方法调用(它通过stackframe进行反向操作)
void recursivebackardprint(节点*node)
{
如果(节点->下一步!=nullptr)
{
递归后退打印(节点->下一步);
}
std::cout您可以在O(n)中执行此操作,每次组合32个布尔值,以便将它们转换为指向前一个32个元素块的指针
算法:
- 读取列表的最后一个元素以使列表大小为%32。(O(n*32)=O(n))
- 在元素32到63中使用布尔值存储指向开始的指针,在元素64到95中使用布尔值存储指向元素32的指针,依此类推(O(n))
- 转到最后32个块(O(n)),读取它们(O(32)),跳回最后64个块(O(1)),按向后顺序读取接下来的32个块(O(32)),跳回最后96个块,依此类推
它是O(n),但至少需要32*n个操作,只有在很长的列表中才值得。为什么?这是一个学术练习吗?使用堆栈:将所有列表元素推到上面,然后你可以按相反的顺序将它们取出来。这就是O(n)
你可以递归地解决它…从开头开始,调用next(递归地)直到到达tail或nullptr…然后递归被关闭,在那里您可以打印出值…它大于O(n)所以在线性时间里是的,但它也很有用,因为指针很重,计算机很难改变它们的位置values@OferMagen到目前为止你都试了些什么?这听起来像是家庭作业。@Ofer Magen:这是你期望的吗?还是我理解错了问题?
void RecursiveBackwardPrint(node* node)
{
if(node->next != nullptr)
{
RecursiveBackwardPrint(node->next);
}
std::cout<<node->value<<std::endl;
}