链接列表中的头节点

时间:2010-12-20 01:18:43

标签: java linked-list head

我在理解链表数据结构中第一个节点或所谓的头部的性质时遇到了问题。链表由节点组成,每个节点包含一些数据和指向列表中另一个节点的链接。但是第一个节点是包含数据的节点还是到第二个节点的链接?或者它只包含一个节点的链接(没有数据)?我认为链表中的第一个节点既有数据又有到另一个节点的链接,但在一本介绍性书中,解释说head是一个节点,但是一个链接可以将你带到第一个节点。同时head是节点类型的变量。为什么会这样? (我在Java工作,如果这很重要)。谢谢。

6 个答案:

答案 0 :(得分:6)

这些称为“虚拟”头节点,它们允许您编写适用于空列表和非空列表的通用代码。

通常,如果要在列表末尾插入Node,则需要两种情况。如果head为空,表示列表为空,则您将head设置为新的Node。如果head不为空,则您按照next指针进行操作,直至获得最后一个Node,并将next指针设置为新Node。< / p>

但是,如果使用虚拟标头,head将永远不会为空。它将是一个带有Node指针的next,您可以将其指向新的Node,如果列表确实包含节点,您将如何指示。

答案 1 :(得分:2)

@falmarri回答说,你可以用任何一种方式实现它。头节点类似于单链接列表中的任何其他节点。它只是一个起始节点,我们可以通过它来遍历链表的其余部分。我们可以将head实现为节点或指针。

答案 2 :(得分:1)

可以把它想象成Node是一个对象,它有一个变量“data”来保存值,另一个变量“next”指向另一个Node对象来建立一个链接。 看下面的java类。

public class ListNode {
private int data;
private ListNode next = null;

public ListNode() {
    // TODO Auto-generated constructor stub
}
//constructor for creating a listNode
public ListNode(int data){
    this.data = data;
}
/*below are setters and getters  */
public void setData(int data){
    this.data = data;
}
public int getData(){
    return this.data;
}
public void setNext(ListNode next){
    this.next = next;
}
public ListNode getNext(){
    return this.next;
}
}

这就是我如何链接它。

//create 3 list node objects
    ListNode one = new ListNode(1);
    ListNode two = new ListNode(2);
    ListNode three = new ListNode(3);

    one.setNext(two);
    two.setNext(three);

但请注意,我们需要知道头节点是否有任何进一步的操作,例如在列表的末尾,开头或随机位置添加ListNode。

在我们的案例中,Head Node是列表链开始的地方之一。

希望它清除:)

由于 Punith

答案 3 :(得分:0)

你可以用任何一种方式实现它。第一个没有数据而只是链接的节点虽然是一个非常奇怪的实现。

答案 4 :(得分:0)

头节点通常与任何其他节点一样,除了它在逻辑上位于列表的开头,没有其他节点指向它(除非你有一个双向链表)。

由于没有其他节点指向它,并且您还需要一种简单的方法来查找列表的开头,因此通常会将一个单独的指针存储到指向头节点的节点。这个指针不是一个节点本身,只是一个指针。

答案 5 :(得分:0)

如果这是在C ++中,您可能更容易理解,但标题节点不仅仅是您用来获得对整个列表的初始访问权的引用。它引用列表中的第一个“完整”节点,该节点包含列表数据集中的数据项和对下一个节点的引用。如果这是C ++,那么节点实际上只是数据结构的“指针”,它只是编译器的内存地址。如果你没有一个指向你的链表的标题节点,那么它将在“以太”中丢失,永远不会被再次访问 - 同时仍占用内存空间。

由于Java在幕后为您处理这个问题,因此您实际上不必担心指针。但是,这可能是你混淆的原因。由于隐藏了如此多的细节,在概念背后没有任何先验知识,您必须接受语法规则而不了解其背后的原因。

概念上,数组是一种列表,就像链表也是一种列表一样。数组按顺序放在内存中,而链表则不是。数组成员仅引用其数据项,但由于成员放在内存中,因此只需通过将整数值乘以该数据项的数据类型的大小添加到整个数组的引用即可访问它们。这与链表不同之处在于链表不是按顺序排列的,因此必须使用更复杂的数据结构来组成列表 - 即“节点”。

但是,由于链接列表没有以任何类型的顺序放在内存中,编译器不必为它预留一大块数据,这就是为什么它可以有任何长度你想要它没有每次更改长度时都必须重新创建一个新的。这与数组不同,因为数组的长度是静态的。另外,一个数组由它的第一个成员引用,即(对于一个名为“a”的数组),这将是“a [0]”或等效的“a”,如果这是C.但是,链接列表不是像这样工作,这就是为什么你有一个“标题”或“虚拟”节点来引用整个事物。

标题节点的另一个问题是,当在链表上执行各种操作时,您还可以创建一个结构与“头节点”类似的节点,以帮助在列表上执行操作。