Data structures 头节点的需要

Data structures 头节点的需要,data-structures,Data Structures,我们说标题链表是由一个称为标题节点的特殊节点组成的链表,它标志着列表的开始 但是我不明白这个头节点的真正重要性是什么。 请帮帮我?使用sentinel节点可以避免处理某些边缘情况 最大的是空检查:您总是知道列表顶部有一个节点,您可以在该节点之后插入节点,因此不必检查head是否为空。(由于类似的原因,它也有助于创建尾部节点) 考虑以下两种情况: 具有头部和尾部节点: addNewDataAtHead( data ): newNode = new Node(data); newNo

我们说标题链表是由一个称为标题节点的特殊节点组成的链表,它标志着列表的开始 但是我不明白这个头节点的真正重要性是什么。
请帮帮我?

使用sentinel节点可以避免处理某些边缘情况

最大的是空检查:您总是知道列表顶部有一个节点,您可以在该节点之后插入节点,因此不必检查head是否为空。(由于类似的原因,它也有助于创建尾部节点)

考虑以下两种情况:

具有头部和尾部节点:

addNewDataAtHead( data ):
    newNode = new Node(data);
    newNode.next = head.next;
    newNode.prev = head;
    head.next.prev = newNode;
    head.next = newNode;
没有:

addNewDataAtHead( data ):
    newNode = new Node(data);
    if (head == null):
        head = newNode;
    newNode.next = head;
    head.prev = newNode;
    head =  newNode;

第一个的意图要清楚得多,因为它类似于插入其他任何地方。第二种情况要求您检查特殊情况。

使用sentinel节点可以避免处理某些边缘情况

最大的是空检查:您总是知道列表顶部有一个节点,您可以在该节点之后插入节点,因此不必检查head是否为空。(由于类似的原因,它也有助于创建尾部节点)

考虑以下两种情况:

具有头部和尾部节点:

addNewDataAtHead( data ):
    newNode = new Node(data);
    newNode.next = head.next;
    newNode.prev = head;
    head.next.prev = newNode;
    head.next = newNode;
没有:

addNewDataAtHead( data ):
    newNode = new Node(data);
    if (head == null):
        head = newNode;
    newNode.next = head;
    head.prev = newNode;
    head =  newNode;

第一个的意图要清楚得多,因为它类似于插入其他任何地方。第二种情况要求您检查特殊情况。

有一种链表,您可以在其中大大简化附加、插入和删除代码,而只需少量存储和遍历链表的最小额外工作

这是因为空列表如下所示:

        +-------+    +-------+
head -> | dummy | -> | dummy | -> null
null <- | head  | <- | tail  | <- tail
        +-------+    +-------+

比较经典的追加(插入是更复杂的,因为你可能需要在头/<代码>之前,在中间,或者在<代码>尾部< /代码>之后)用简化的一个:

def append (node):                      def append (node):
    node->next = null                       node->next = tail
    if head == null:                        node->prev = tail->prev
        head = node                         tail->prev = node
        tail = node
        node->prev = null
    else:
        tail->next = node
        node->prev = tail
        tail = node
删除操作也大大简化,因为使用经典链表时,需要进行大量检查以确保不会取消引用空指针:

def delete (node):                      def delete (node):
    if node == head and node == tail:       if node != head and node != tail:
        head = null                             node->prev->next = node->next
        tail = null                             node->next->prev = node->prev
    elsif node == head:                         free node
        head = head->next
        head->prev = null
    elsif node == tail:
        tail = tail->prev
        tail->next = null
    else:
        node->prev->next = node->next
        node->next->prev = node->prev
    free node
遍历列表的代码当然需要排除虚拟节点,但这是一个微不足道的更改:

def traverse (head):                    def traverse (head):
    node = head                             node = head->next
    while node != null:                     while node != tail:
        do something with node                  do something with node
        node = node->next                       node = node->next


我自己并不喜欢这样的代码,因为这可能表明人们太懒了,不了解数据结构和算法是如何工作的。我更希望有更复杂的代码,因为它显示了一个指示,人们可以思考的事情。在任何情况下,这都是您只需编写一次的事情。

有一种链表,您可以在其中大大简化附加、插入和删除代码,而只需少量存储和遍历链表的最小额外工作

这是因为空列表如下所示:

        +-------+    +-------+
head -> | dummy | -> | dummy | -> null
null <- | head  | <- | tail  | <- tail
        +-------+    +-------+

比较经典的追加(插入是更复杂的,因为你可能需要在头/<代码>之前,在中间,或者在<代码>尾部< /代码>之后)用简化的一个:

def append (node):                      def append (node):
    node->next = null                       node->next = tail
    if head == null:                        node->prev = tail->prev
        head = node                         tail->prev = node
        tail = node
        node->prev = null
    else:
        tail->next = node
        node->prev = tail
        tail = node
删除操作也大大简化,因为使用经典链表时,需要进行大量检查以确保不会取消引用空指针:

def delete (node):                      def delete (node):
    if node == head and node == tail:       if node != head and node != tail:
        head = null                             node->prev->next = node->next
        tail = null                             node->next->prev = node->prev
    elsif node == head:                         free node
        head = head->next
        head->prev = null
    elsif node == tail:
        tail = tail->prev
        tail->next = null
    else:
        node->prev->next = node->next
        node->next->prev = node->prev
    free node
遍历列表的代码当然需要排除虚拟节点,但这是一个微不足道的更改:

def traverse (head):                    def traverse (head):
    node = head                             node = head->next
    while node != null:                     while node != tail:
        do something with node                  do something with node
        node = node->next                       node = node->next


我自己并不喜欢这样的代码,因为这可能表明人们太懒了,不了解数据结构和算法是如何工作的。我更希望有更复杂的代码,因为它显示了一个指示,人们可以思考的事情。无论如何,这是一种你只想写一次的东西。

你的问题太模糊而无法回答。你的问题太模糊而无法回答。