我正在使用Java链接列表,所以我试图掌握单个链表的概念。
head -> 12 -> 34 -> 56 -> null
head.next
将为12(也与node1相同)。然而,什么是头呢?
更新:参考和指针有什么区别?
更新2:因此,如果head
为12
且head.next
为34
,则表示此后续功能不会跳过第一个节点看看它是否为空?
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
答案 0 :(得分:26)
列表的头部指的是列表的第一个节点。它会为存储该节点引用的变量建立一个好名称,如果列表为空,我希望它包含空引用
someLinkedList.head
|
|
v
______ ______ ______
| |n| | |n| | |n|
| |e| | |e| | |e|
| 12 |x| --> | 34 |x| --> | 56 |x| --> null
| |t| | |t| | |t|
|____|_| |____|_| |____|_|
根据上下文,尾部可以指代不同的东西。我习惯的术语是尾部对应于此示例中的34 -> 56 -> null
,即头部后面的列表。
在其他情况下,它可能是对最后一个节点的引用。在这种解释中,尾部将引用示例中的56
节点。
关于您的第一次编辑,恰好是完全不同的问题:
指针是与存储器地址对应的值。引用是指引用某个对象(或null)的值。你不能在Java引用上做指针算术,但除此之外我会说它们非常相似。
可能让您感到困惑的是,Java中的变量永远不会包含对象。对象总是存在于堆上,变量包含原始数据类型或对堆上对象的引用。
关于你的第二次编辑:
在您提供的示例中,看起来add方法会跳过第一个元素,从某种意义上说,它会跳过第一个元素。这是因为实现具有“虚拟”元素作为头部。查看构造函数中head-variable的初始化:
head = new Node(null);
我无法理解为什么他们决定这样做。对我来说,它看起来很愚蠢。
答案 1 :(得分:6)
术语“头部”有两个完全不相关的含义。最常见的(来自Lisp,我相信)是“列表的第一个元素。”从你的图表来看,这不是你想到的意思。
第二个含义是指处理以下问题的技术:如果您将链表表示为仅包含数据的节点,那么当列表为空时,所有引用(和/或指针,取决于语言)列表必须为null,因为没有什么可指向的。这为使用列表的代码创建了大量的簿记问题。 列表头解决了这个问题。它是一个不包含实际数据的列表节点。指向列表的引用或指针始终是指向头节点的指针。列表的第一个元素始终是head.next
。通常头部的存在隐藏在实现“带头的链表”的类中。
根据所支持的操作,列表末尾可能存在类似的簿记问题,尤其是对于双向链接列表。 list tail 节点简化了簿记。
这些在文献中也被称为“哨兵节点”(包括Wikipedia article on linked lists)。
答案 2 :(得分:4)
是的,它只是指向第一个节点的指针
答案 3 :(得分:2)
在其他任何事情之前应该注意,head不是一个单独的节点,而只是对第一个节点的引用。它通过存储指向第一个节点的指针来保留整个列表。
另一个显着的区别是head是一个普通的本地指针变量,存储在堆栈中,而列表节点存储在堆中。 所以在大多数术语中,Head只是一个本地指针,它保持对链表的第一个元素的引用,并且大部分都是用NULL初始化以区分空链表。