C++ 链接列表的头节点和起始节点有什么区别?

C++ 链接列表的头节点和起始节点有什么区别?,c++,C++,链接列表中的头节点是否有任何信息,或者它是否仅指向链接列表的第一个节点? 我们可以将头节点定义为链接列表的起始节点吗? 头部节点是否仅指向第一个节点? 链表由节点组成,每个节点都包含一些数据和指向列表中另一个节点的链接。但是第一个节点是包含数据和到第二个节点的链接的节点吗?或者它只包含到节点的链接(而不包含数据)?我认为链表中的第一个节点既有数据又有到另一个节点的链接,但在一本介绍性的书中,它解释了头是一个节点,但它是一个链接,可以让你到达第一个节点。同时head是节点类型的变量。为什么会这样

链接列表中的头节点是否有任何信息,或者它是否仅指向链接列表的第一个节点?
我们可以将头节点定义为链接列表的起始节点吗?
头部节点是否仅指向第一个节点?
链表由节点组成,每个节点都包含一些数据和指向列表中另一个节点的链接。但是第一个节点是包含数据和到第二个节点的链接的节点吗?或者它只包含到节点的链接(而不包含数据)?我认为链表中的第一个节点既有数据又有到另一个节点的链接,但在一本介绍性的书中,它解释了头是一个节点,但它是一个链接,可以让你到达第一个节点。同时head是节点类型的变量。为什么会这样?

这取决于实现。
head
变量通常是一个节点指针,指向列表中的第一个节点,例如在这个单节点列表中:

        +--------+
head -> | node 1 | -> NULL
        +--------+
然而,我见过一些实现,其中一个“空”(双链接)列表由两个节点组成,这样插入和删除代码就不必担心尝试在头部之前或尾部之后插入或删除头部/尾部的边缘情况

由于要插入的每个位置(以及允许删除的每个节点)都有一个
prev
next
节点,因此代码被简化

        +-------+    +------+    +-------+
head -> | dummy | -> | node | -> | dummy | -> NULL
NULL <- |  node | <- |   1  | <- |  node | <- tail
        +-------+    +------+    +-------+

由于必须从
curr=head.next
而不是
curr=head
开始,并在
curr==last
而不是
curr==NULL
结束,所以列表遍历稍微复杂一些,但有些人认为这是一种有效的权衡,代价是两个未使用的节点。

这取决于实现。
head
变量通常是一个节点指针,指向列表中的第一个节点,例如在这个单节点列表中:

        +--------+
head -> | node 1 | -> NULL
        +--------+
然而,我见过一些实现,其中一个“空”(双链接)列表由两个节点组成,这样插入和删除代码就不必担心尝试在头部之前或尾部之后插入或删除头部/尾部的边缘情况

由于要插入的每个位置(以及允许删除的每个节点)都有一个
prev
next
节点,因此代码被简化

        +-------+    +------+    +-------+
head -> | dummy | -> | node | -> | dummy | -> NULL
NULL <- |  node | <- |   1  | <- |  node | <- tail
        +-------+    +------+    +-------+

由于必须从
curr=head.next
而不是
curr=head
开始,并在
curr==last
而不是
curr==NULL
结束,所以列表遍历有点复杂,但有些人认为这是一种有效的权衡,以两个未使用的节点为代价。

通常,头节点是链表的第一个节点,但从“类型”的角度来看,它与任何其他节点没有区别。它确实包含数据以及指向下一个节点(链接列表的第二个节点,如果存在的话)的指针。

通常,头节点是链接列表的第一个节点,但从“类型”的角度来看,它与任何其他节点没有什么不同。它确实包含数据以及指向下一个节点(链接列表的第二个节点,如果存在的话)的指针。

您至少可以用三种不同的方法来完成

  • 存储指向列表对象内节点的指针
  • 有一个包含空数据成员的“head”节点
  • 有一个没有数据成员的特殊“头”节点
每种方法都有利于某些操作或优化所用空间的权衡

拥有与其他节点相同类型的head对象可以简化某些链接操作。拥有一个没有数据有效负载的头部节点可以节省内存。将指针存储在列表对象中可能会为空列表保存动态分配,但会使
交换
更难实现


没有一种绝对适合所有用途。

你至少可以用三种不同的方法

  • 存储指向列表对象内节点的指针
  • 有一个包含空数据成员的“head”节点
  • 有一个没有数据成员的特殊“头”节点
每种方法都有利于某些操作或优化所用空间的权衡

拥有与其他节点相同类型的head对象可以简化某些链接操作。拥有一个没有数据有效负载的头部节点可以节省内存。将指针存储在列表对象中可能会为空列表保存动态分配,但会使
交换
更难实现


没有一个绝对适合所有用途。

它完全取决于链表的实现。它完全取决于链表的实现。看起来我们非常有说服力地争论了对方:)@Sid:基本上这是因为问题不好。看起来我们非常有说服力地争论了对方:)@Sid:基本上这是因为这个问题很糟糕。这个答案不一定正确。实现列表的方法有很多种,本例只是其中之一。@Carl-我并没有说这是唯一的方法。我只是说这是约定。你有什么依据来说明这个实现是约定的?主要是经验,以及我从大多数数据结构教科书中学到的。这个答案不一定是真的。实现列表的方法有很多种,本例只是其中之一。@Carl-我并没有说这是唯一的方法。我只是说这是约定。你有什么依据来说明这个实现是约定的?主要是经验和我从大多数数据结构教科书中学到的东西。