【问题标题】:The drawback in a basic singly linked list implementation using a node class使用节点类的基本单链表实现的缺点
【发布时间】:2021-04-27 03:21:37
【问题描述】:

我正在关注 CCI 书籍,它具有以下内容作为最基本的链表实现。

class Node { 
    
    Node next = null;
    int data;

    public Node (int data) { this.data = data; }

    void appendToTail(int d){ 

        Node iterHead = this; 
        Node newNode = new Node(d);
        while(iterHead.next != null){ 
            iterHead = iterHead.next;
        }
        iterHead.next = newNode;
    }
}

我知道我们将通过此处对头节点的引用来访问该列表。作者提到这个实现是有问题的,因为 - 我解释说,“如果多个对象需要对列表的引用,并且头部发生变化,一些旧对象可能指向旧头部”

我不太明白她在这种情况下“改变头部”的意思,以及它将如何影响使用列表引用的其他对象。也许有人可以通过一个例子帮助我理解这一点。第一次在这里发帖,如果有任何帮助,我将不胜感激。

【问题讨论】:

  • 在你的例子中,你总是追加到尾部而不是改变头部。所以这个问题在这里适用。首先,也许尝试运行一个适合您的问题的示例。任何方式上的良好实施都不会出现问题! (始终应正确链接对象,无论如何制作自定义列表或调用哪种类型的操作)
  • 你的意思是这个问题*不适用于这里,对吧?如果我上面的实现以某种方式扩展,以便我可以在前面添加节点从而改变头部,那么我可以理解这是怎么回事。
  • 是的,在您的情况下不适用,因为添加到尾部。但是当然你可以扩展列表以添加到头,从头尾删除元素,添加到特定索引。然后你应该检查所有情况。不完整的实施可能会导致问题。 (认为​​作者可能会警告一些不完整的实现,意味着有些情况没有涵盖然后问题)
  • 是的,我现在明白了。谢谢!

标签: java algorithm oop linked-list


【解决方案1】:

Linked List 是一种数据结构,很容易从列表中添加和删除节点,这些操作应该被视为预期用途。

它可能看起来令人困惑的主要原因是因为上面的链接列表缺乏使结构真正有用的实现,而这些可能会导致问题。

当作者在“换头”时说有问题时,可能是在考虑以下几种情况:

我们在 head 之前添加一个新节点并使其成为新的 head。在我们需要遍历列表的情况下,引用旧头意味着可能不会考虑当前头之前的任何内容。

我们添加新节点并丢弃旧头,无论出于何种原因它不再可用。对旧头的引用可能会读取当前不应该存在的数据。

可能有更多的场景,但重点是你必须小心引用链表的内容。我经常维护一个空值的头节点,它总是停留在所有东西的前面。

编码愉快!

【讨论】:

  • 嗨。感谢您的回答!我想我在这里有点隧道视野。我是按照上面的代码进行的,它实际上并没有让你以任何方式“改变头部”。如果我的代码以某种方式允许您添加新的磁头和/或丢弃现有的磁头,那么您的解释非常有意义。无论如何,它为我增加了一个新的视角。这里真正的问题是对列表的引用是对头部本身的引用。
猜你喜欢
  • 2012-05-15
  • 2019-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多