Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 在不更改链接列表的情况下向后读取链接列表_Algorithm_Linked List - Fatal编程技术网

Algorithm 在不更改链接列表的情况下向后读取链接列表

Algorithm 在不更改链接列表的情况下向后读取链接列表,algorithm,linked-list,Algorithm,Linked List,给定一个单链表,向后读取该列表。这个问题听起来很简单,但是(!)你不能更改链表的指针,你只能使用3个变量(指针或其他变量),每个单元格都有一个以false开头的bool标志,你可以随意使用 在O(n^2)中很容易做到,但我认为有一个更好的解决方案(可能是O(n)?)。这种递归方法只需在列表上迭代一次。所以它是O(n) 它是如何工作的: 它递归地遍历列表,直到列表结束,并在stackframe上添加methodcall。最后,它打印出最后一个节点,并返回到第二个最后一个方法调用(它通过stackf

给定一个单链表,向后读取该列表。这个问题听起来很简单,但是(!)你不能更改链表的指针,你只能使用3个变量(指针或其他变量),每个单元格都有一个以false开头的bool标志,你可以随意使用


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