向后阅读链接列表而不更改它

时间:2016-06-06 14:46:09

标签: algorithm linked-list

鉴于单个链接列表向后读取列表。这听起来像一个简单的问题,但是(!)你不能改变链表的指针,你只能使用3个变量(指针或其他变量),每个单元格都有一个以false开头的bool标志,你可以使用它如你所愿。

在O(n ^ 2)中很容易做到,但我认为有更好的解决方案(也许是O(n)?)。

2 个答案:

答案 0 :(得分:2)

这种递归方法只能在列表上进行一次迭代。所以它是O(n)。

它是如何运作的:

它在列表中递归,直到它结束并在stackframe上添加方法调用。最后它打印出最后一个节点并返回到第二个最后一个方法调用(它通过堆栈框架反向驱动)

void RecursiveBackwardPrint(node* node)
{
    if(node->next != nullptr)
    {
        RecursiveBackwardPrint(node->next);
    }
    std::cout<<node->value<<std::endl;
}

答案 1 :(得分:1)

你可以在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次操作,它只适用于很长的列表。