【问题标题】:Delete a 10000th node in linked list删除链表中的第 10000 个节点
【发布时间】:2017-02-22 02:27:02
【问题描述】:

我有一个 n 个节点的链表,我想删除第 k 个节点并显示其中的元素。如果 n 的值相对较小并且问题的复杂性不是问题,这很容易。

问题是当我在链表中​​有 n 个节点,其中 n >=200000 并且我想删除一个节点,该节点也是一个相对较大的值(比如 k=150000)。

这个问题的正常解决方案是遍历整个链表并删除一个节点(解决方案的复杂度为 O(n) ),虽然它是直接且简单的解决方案,但需要更多时间。这个问题的其他解决方案可以是 2 个指针,但这仍然不是最佳解决方案。

我正在寻找一种最佳的解决方案,并在最短的时间内提供结果。

希望我的问题很清楚。需要帮助..

【问题讨论】:

  • 这只是一个面试问题还是你有一个真实世界的场景?如果以后,您能否就其他事情提供更多见解,例如您可以控制什么以及可以改变什么?
  • 如果你有一个单链表,那么你唯一的选择就是 O(n) 解决方案。是否允许修改数据结构以添加更多信息?就像其中一个答案所建议的那样维护对中间节点的引用列表?

标签: algorithm data-structures linked-list time-complexity skip-lists


【解决方案1】:

使用SkipList 概念。

这就像使用 Express 车道或高速公路,以尽可能快的速度到达所需的节点(通过选择最小的遍历长度)。

您需要创建多个层,以便您可以跳过一些节点毫不犹豫。

TC: 与二叉搜索树 O(log n) 的平均运行时间相同。

不需要对给定链表进行复杂的重组。

【讨论】:

    【解决方案2】:

    你有一个链表,所以你的访问是 O(n).. 我看到两个选择:更改您的容器或使用辅助容器来加速直接访问(增加您的空间复杂性).. 您不会找到适用于所有治疗的复杂度为 O(1) 的神奇容器。

    【讨论】:

    • 感谢您的解决方案,但除非没有其他方法,否则我认为增加空间复杂性并不是一个好选择。
    • 虽然不是O(1),但是O(log n)肯定可以通过skip-list实现,比O(n)有了很大的提升。
    【解决方案3】:

    在标准链表中,没有办法(没有额外的指针)快速访问链表后面的元素,因为对所述元素的唯一引用发生在它之前的元素中。

    如果您知道经常需要访问索引已知的元素,那么最好只使用数组。 (虽然重新阅读了问题,但这仍然对删除元素没有任何好处)

    【讨论】:

    • 感谢马特的解决方案。但我有一个小疑问(虽然我觉得我想清除它很愚蠢),假设我有列表的第一个节点的地址,通过使用这个地址并知道每个节点的大小并做一些基本的数学运算,我能知道链表中第k个节点的地址吗?
    • 直接访问元素?
    • @sushh 不,你不能。您只能使用将元素存储在连续内存地址中的容器来执行此操作。与数组不同,列表存储在不连续的内存地址中。这就是列表中删除操作更容易且成本更低的原因,因为您不必将尾随元素向前移动。
    • 不一定,因为链表的好处之一是节点不需要按顺序排列,这意味着在大多数情况下无法预测特定节点。
    • @SauravSahu 和马特感谢您的回复。我意识到为什么它不能完成。
    猜你喜欢
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-13
    • 1970-01-01
    相关资源
    最近更新 更多