返回首页


CONCAT为O(1)或O(N)?
。NET LinkedList是一个双向链表循环链表,其中每个节点拥有其前一个和下一个节点的参考。 AOS下的最后一个节点,头节点,头节点,,AOS以前是最后一个。
{A}
链表是有吸引力的,因为为O(1)插入和删除操作。数组元素转移,而是你只是在适当的顺序链节点和,AOS。
按照这一逻辑,串联两个列表应该是类似的O(1)操作。您刚才绑定的第二头的第一个列表,并让结果列表点完对方。
不过,如果你看一下。NET LinkedList实现,你会发现,只有这样,才能加入两个链表是第一个到的第二个列表逐个添加元素。这是O(n)操作。实施CONCAT
所以,如果你在执行,你会发现,LinkedListNode有更多的外地,除了之前和未来。这是一个参考的所有者列表。因此,与此实现,即使你在O(1)实施的concat如上所述,你将仍然需要至少reparent再次Ø(N)操作的所有节点。
我们能否避免在每一个节点的引用列表?是的,我们能做到。这样,我们可以重写Previous和Next属性。前

public LinkedListNode Next

{

    get

    {

        if ((this.next != null) && (this.next != this.list.head))

        {

            return this.next;

        }

        return null;

    }

}

消除家长检查异常处理代码LinkeList实施后,你可以实现这样的连接:
public void Concat(SimpleLinkedList secondList)

{

    if (secondList.m_Head == null)

    {

        return;

    }



    if (this.m_Head == null)

    {

        this.m_Head = secondList.m_Head;

    }

    else

    {

        var seamLeft = this.Last;

        var seamRight = secondList.m_Head;

        var newEnd = secondList.Last;



        seamLeft.Next = seamRight;

        seamRight.Prev = seamLeft;

        newEnd.Next = this.m_Head;

        this.m_Head.Prev = newEnd;

    }

}

你甚至可以通过添加两个列表的计数保持正确Count属性。{体C3}缺点
这种解决方案的主要缺点是,第二份名单将在此操作后留下一个不一致的状态。其last.prev不指向了其头部。另一点是积极运作,名单上的任何修改,因此他们有共同的节点。这些副作用,违反了面向对象的设计的基本原则。所以,我可以想像,微软赢了,在这一点上AOT妥协,并决定不落实的串联。关于分割呢?
实施拆分是非常相似,不同之处在于你是不是能够保持在O(1)时间计数的财产。你是不知道其内部列表指数在某些节点分裂。所以如果你想有一个拆分操作,你应该妥协Count属性。Concat的扩展方法
有Concat的扩展方法上IEnumarable接口。你可能会认为,AOS计数IEnumarable扩展方法愚蠢花费O(N),将所有一起。
事实上,它在O(1)执行返回一个新的枚举,其中列举了第一份清单,并跳转到第二个时,第一个列表达到结束。
这可能有助于如果您不打算继续与串联工作导致像一个LinkedList。另一点是,随后几个串联操作造成嵌套统计员。所以,你得到比统计员统计员树,等我的实现
我执行双重链接列表支持的concat和分裂的实际目标是尝试和示范测试驱动的重构方法。
先执行只是派生常见。NET中的LinkedList。{的C4}
第二步是建立相应的测试集,确保共同LinkedList的行为。例子{C5的}

我有一个合理设置后,我开始实施的功能先后。下面是结果呢??SimpleLinkedList。优势更少的内存消耗,从而每个节点SimpleLinkedListNode具有不同于原来的三分(之前,未来,价值),而不是四(之前,未来,列表值)。NET实现。支持CONCAT和分割操作,在O(1)在O支持IEnumarable反向()枚举(1)??的方式,我没有看到任何原因为何,AOS没有提供的。NET中的LinkedList本身。适当扩展方法需要O(N)。缺点不支持计数。Concat的运作留下第二个列表处于不一致的状态。拆分操作,离开原来的列表处于不一致的状态。你都能够分享到节点列表之间。我选择了替代战略的实施枚举和操作,而不是更详细的和纯粹可读的原实施。我希望的性能产生负面影响仍然微不足道。
所以要小心使用这个列表,并使用它,只有当你知道后果。
{A2} {S8的}

回答