2

我正在为学校作业编写我自己的双向链表实现,我使用了一个Node在列表类内部调用的内部节点类,它表示相互链接的列表节点(通常是链表的情况)。

class DoublyLinkedList<T>
{
    class Node
    {
        T obj;
    }
}

我想知道,对于具有许多节点的大型列表,由于每个Node对象都可能引用父列表类的一个实例,这是一个显着的开销和次优设计吗?作为一个非静态类肯定很方便——然后节点可能会改变父列表firstlast引用,我发现它们非常适合封装。

如果我Node设为静态,它就不能再(没有对列表的显式成员引用)用于操作父列表firstlast并且我必须从其他方式处理它 - 列表将通过自己的方法分配和操作节点,也就是将它们相互链接,取消链接并自然调整其firstlast值。

为了良好的设计和学习,我想知道The Smart Thing To Do (c)(如果有的话)是什么?

4

2 回答 2

4

如果内部类不是static,则对父类的隐式引用已经存在,您可以DoublyLinkedList.this从内部Node类中引用它。

无论如何,我不明白为什么一个Node类应该能够直接修改其父类的属性。改变列表的方法(如此firstlast同样)应该是DoubleLinkedList类的,而不是直接的Node类。这正是为了封装,一个Node实例不应该知道它包含在哪里或如何从外部使用它。

于 2013-03-09T14:33:57.023 回答
2

开销将恰好是每个节点的一个引用。假设除了有效负载之外的节点还具有先前链接和反向链接,对父节点的额外引用的开销将在额外内存使用中达到约 33%(在 3 个现有引用之上的 1 个引用)。这是相当大的开销,尤其是对于大节点数和小负载。另一方面,对于更大的有效载荷,这并不重要。

In general, though, I would not make an assumption about the payload size, and make the Node class static.

于 2013-03-09T14:35:45.603 回答