【问题标题】:What is the 'head' of a linked list?链表的“头”是什么?
【发布时间】:2011-06-25 19:32:24
【问题描述】:

我正在使用 Java 中的链表工作,所以我试图掌握单链表的概念。

head -> 12 -> 34 -> 56 -> null

head.next 将是 12(也与 node1 相同)。但是,什么是头呢?

更新:引用和指针有什么区别?

Update2:所以如果head12 并且head.next34,那么并不意味着下面的函数会跳过第一个节点来查看它是否为空?

public void add(Object data, int index)
    // post: inserts the specified element at the specified position in this list.
    {
        Node temp = new Node(data);
        Node current = head;
        // crawl to the requested index or the last element in the list,
        // whichever comes first
        for(int i = 1; i < index && current.getNext() != null; i++)
        {
            current = current.getNext();
        }
        // set the new node's next-node reference to this node's next-node reference
        temp.setNext(current.getNext());
        // now set this node's next-node reference to the new node
        current.setNext(temp);
        listCount++;// increment the number of elements variable
    }

来源:http://www.mycstutorials.com/articles/data_structures/linkedlists

【问题讨论】:

  • 现在尝试断章取义地阅读问题。这没有任何意义:)
  • 一些上下文可能会有所帮助...

标签: java data-structures linked-list


【解决方案1】:

链表的头是指链表的第一个节点。它将为存储该节点引用的变量取一个好名字,如果列表为空,我希望它包含空引用

someLinkedList.head
         |
         |
         v
        ______        ______        ______            
       |    |n|      |    |n|      |    |n|           
       |    |e|      |    |e|      |    |e|           
       | 12 |x| -->  | 34 |x| -->  | 56 |x| --> null
       |    |t|      |    |t|      |    |t|           
       |____|_|      |____|_|      |____|_|           

根据上下文,尾巴可以指代不同的事物。我习惯的术语说,在这个例子中,尾部对应于34 -&gt; 56 -&gt; null,即头部之后的列表。

在其他情况下,它可能是对最后一个节点的引用。在这种解释中,尾部将引用您示例中的 56 节点。


关于您的第一次编辑,这恰好是一个完全不同的问题

指针是对应于内存地址的值。引用是引用某个对象(或 null)的值。您不能对 Java 引用进行指针运算,否则我会说它们非常相似。

您可能会感到困惑的是,Java 中的变量永远不能包含对象。对象总是存在于堆上,而变量包含原始数据类型,或对堆上对象的引用。


关于您的第二次编辑:

在您提供的示例中,add 方法似乎跳过了第一个元素,并且在某种意义上确实如此。这是因为实现有一个“虚拟”元素作为头部。看构造函数中head-variable的初始化:

head = new Node(null);

我不明白他们为什么决定这样做。对我来说,这看起来很愚蠢。

【讨论】:

  • 所以,head.next 会给出 12,而 head.next.next 会给出 34,对吗?那么什么是 head(你说的是 null 对吗?)?尾巴总是指向指向“null”的节点对吗?
  • 不,head 将引用 12 节点。 head.next 将是 34(您已关注 one next 参考!)。请记住,head 不是对象,而是引用。
  • 关于尾巴的问题呢?另外,我有点困惑,我会更新我的问题。
  • 答案已更新。现在,如果您有任何后续问题,请创建一个新问题。
  • 实际上大多数列表的实现都为头/尾节点使用了一个虚拟节点,因为它使代码更简单(您不需要到处检查 null)。 Java 实现也是这样做的。
【解决方案2】:

“头”一词有两个完全不相关的含义。最常见的(我相信来自 Lisp)是“列表的第一个元素”。从你的图表来看,这不是你想要的意思。

第二个含义是指一种处理以下问题的技术:如果您将链表表示为仅具有数据的节点,那么当列表为空时,所有引用(和/或指针,取决于语言)到列表必须为空,因为没有什么可以指出的。这会给使用列表的代码带来很多记账问题。 list head 解决了这个问题。它是一个不包含实际数据的列表节点。指向列表的引用或指针始终是指向头节点的指针。列表的第一个元素始终是head.next。通常head的存在隐藏在实现“带head链表”的类中。

根据支持的操作,列表末尾可能存在类似的簿记问题,尤其是对于双向链表。 list tail 节点简化了簿记。

这些在文献中也被称为“哨兵节点”(包括Wikipedia article on linked lists)。

【讨论】:

    【解决方案3】:

    是的,它只是指向第一个节点的指针

    【讨论】:

    • @Oli Charlesworth 不该投反对票。术语“点”不是在 C 意义上使用的。它有点回答模糊的问题(尽管它可能是一个无用的答案)
    • @Bohzo:我认为这个答案没有任何价值(这只是基于零信息的猜测,并且使用了不正确的术语);因此投反对票。
    • 即使问题没有上下文,这个问题是在询问一个链表,是的,Java 确实有“指针”,你只是无法真正控制它们。
    • @Tbone:有一个更合适的词,那就是“参考”!
    • 抱歉,你是对的,我的第一语言是 C++,所以当我看到参考文献时,我想到了一个指针 :)
    【解决方案4】:

    Before Anything else 需要注意的是,head 不是一个单独的节点,而只是对第一个节点的引用。它通过存储指向第一个节点的指针来保存整个列表。

    另一个值得注意的区别是 head 是一个普通的本地指针变量,它存储在堆栈中,而列表节点存储在堆中。 所以在大多数行话中,Head 只是一个本地指针,它保持对链表的第一个元素的引用,并且大部分初始化为 NULL 以区分空链表。

    【讨论】:

    • 如果是第一个元素,比如list1,如果是list1.next != null,你将它设置为NULL。你会破坏第一个元素到下一个元素的链接吗?我的意思是第一个元素会是一个单独的元素而不指向其他元素吗?
    • 是的,没错。如果您将list1.next 设置为null,则list1 节点实际上将是列表中的最后一个节点。
    • 是的确实..这里在这种情况下 list1 == 头指针.. 所以如果我让 list1.next=NULL 只有一个节点会留在列表中。此外,要让整个列表为空,你有使 list1=NULL。
    猜你喜欢
    • 2018-06-04
    • 2014-01-03
    • 2022-01-16
    • 2011-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-26
    • 1970-01-01
    相关资源
    最近更新 更多