首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检查循环链接列表的算法

检查循环链接列表的算法
EN

Stack Overflow用户
提问于 2016-05-12 08:05:30
回答 6查看 165关注 0票数 3

我想找一种checks a linked-list with n elements for consistency算法。链接列表使用dummy head (也称为哨兵节点)。该算法需要run in O(n) time,除了迭代列表所需的空间外,还允许use O(1) extra space。列表的size is unknown。另外,它是forbidden to modify the list

如果存在指向前一个列表项的列表项,则列表计算为不一致。首先,我考虑存储第一个元素,然后遍历列表,同时将当前元素与第一个元素进行比较。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2016-05-12 13:13:00

这是我对第二个问题的解决办法。

代码语言:javascript
复制
IsConsistent(LinkedList<Item> list) :N
    slow = List.Sentinel.next :Element
    fast = slow.next :Element
    isConsistent = true :boolean
    while(fast != list.Sentinel && fast.next != list.Sentinel && isConsistent) do
        if(slow == fast)
            isConsistent = false
        else 
            slow:= slow.next
            fast:= fast.next.next 
    od
    if(isConsistent)
        return 0
    else
        position = 0 : N
        slow:= list.Sentinel
        while(slow != fast) do
            slow:= slow.next
            fast:= fast.next
            position:= position + 1
        od
        return position
票数 1
EN

Stack Overflow用户

发布于 2016-05-12 09:34:54

该列表是否提供了一个Size属性,该属性告诉您它包含多少个元素而不遍历它?

如果这样做了,那么满足所有大O要求的简单解决方案就是尝试遍历列表,并在执行过程中计算元素。如果计数超过了列表中预期的元素数,那么它就有一个循环。

伪代码看起来如下所示:

代码语言:javascript
复制
bool isConsistent (List list)
{
    bool consistent = true;
    Node node = list.Sentinel.Next;
    int count = 0;

    while (node != list.Sentinel && consistent)
    {
         count++;

         if (count > list.Size)
             consistent = false;

         node = node.Next;
    }

    return consistent;
}

这在O(n)中完成,并使用O(1)存储。

票数 3
EN

Stack Overflow用户

发布于 2016-05-12 11:36:36

弗洛伊德的“龟兔”算法可以满足您的需要,只需要进行一次小的修改就可以处理虚拟头/尾(哨兵)节点。

下面是我如何编写伪代码:

代码语言:javascript
复制
bool IsConsistent (List list)
{
    Node tortoise = list.Sentinel.Next;
    Node hare = tortoise.Next;

    while (tortoise != list.Sentinel && hare != list.Sentinel)
    {
        if (tortoise == hare)
            return false;

        tortoise = tortoise.Next;
        hare = hare.Next.Next;
    }

    return true;
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37180859

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档