【问题标题】:Pseudo logic to Detect loop in Singly linked list在单链表中检测循环的伪逻辑
【发布时间】:2011-12-02 22:02:09
【问题描述】:

下面给出一个包含循环的单链表示例

node_1 --> node_2 --> node_3 --> node_4 --> node_5 --> node_3

我想通过考虑性能因素来检测任何给定链表是否存在循环。

【问题讨论】:

标签: data-structures


【解决方案1】:

初始化一个哈希。 遍历列表。 对于每个节点,如果它已经在哈希中,则返回 LOOP。 否则,将其添加到哈希中。 当到达列表末尾时,返回 NO_LOOP。

注意:您不必将整个节点放入散列中。一个标识符就足够了,或者任何其他唯一标识节点的东西。

【讨论】:

  • 我认为这比 Floyd 的循环查找算法效率低,因为它是 O(n) 存储
  • 它使用更多的内存,但它的实际运行时间应该更短(即使它们都是 O(n))。
  • 我想这取决于形成循环的子集有多大,如果它存在的话。我怀疑这是在现实世界中您会在测量实际实现后为特定大小的列表选择一个,而为其他列表选择另一个。
  • @EranZimmerman:如果列表大小超过 10000(假设),这将使用更多内存。应避免将数据存储到其他数据结构,我们也应避免修改 Node 中的数据。
【解决方案2】:
function boolean hasLoop(Node startNode){
      Node slowNode = Node fastNode = startNode;
      while(true){
          if(slowNode)
             return false;
          else if(((slowNode==fastNode)&&fastNode!=startNode)||fastNode->next==slowNode)
              return true;
          else{
              slowNode=slowNode->next;
              fastNode=fastNode->next->next;
          }
      }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-06
    • 2010-12-04
    • 2011-12-04
    • 1970-01-01
    • 1970-01-01
    • 2021-01-18
    相关资源
    最近更新 更多