链接列表头C

Linked List Head C++

本文关键字:表头 列表 链接      更新时间:2023-10-16

我正在为数据结构类制作一个简单的链接列表,并且很难理解头部指针应该如何工作。

我有

template <typename E>
class SSLL{
template<typename E>
        struct Node {
            E data;
            Node* next;
        };
public:
template <typename E>
    SSLL();
    void push_front(E element);
private:
    Node<E> * head;
    Node<E> * tail;
};
template <typename E>
SSLL<E>::SSLL() {
    head = NULL;
    tail = NULL;
}
template <typename E>
void SSLL<E>::push_front(E element) {
    Node<E> * n = new Node<E>;
    n->data = element;
    n->next = head;
    head = n;
    if (!tail) {
        tail = n;
    }
}

但是,这不是使头成为列表中的第一个元素,而不是指向第一个元素的指针。

我尝试将push_front(e element)更改为此,但正在获取空指针错误。

template <typename E>
void SSLL<E>::push_front(E element) {
    Node<E> * n = new Node<E>;
    n->data = element;
    n->next = head->next;
    head->next = n;
    if (!tail) {
        tail->next = n;
    }
}

我在网上发现的所有示例都有头= n,但是我仍然很难理解为什么它是那样而不是head-> next =n。

谢谢。

在大多数形式的链接列表中,头指针指向列表中的第一个节点或为null:

         +---+     +---+     +--+  
head --> | A | --> | B | --> |/0|  
         +---+     +---+     +--+  
                     ^  
                     |  
tail ----------------+  

许多初学者将列表与节点混淆。节点是包含数据的对象。列表是节点的集合。

在头上推
在前面插入需要以下步骤:

  1. 使新节点指向头节点。
  2. 更改头节点以指向新节点。

1)使新节点指向头节点:

         +---+  
p_new -->| C |
         +---+  
           |  
           V  
         +---+     +---+     +--+  
head --> | A | --> | B | --> |/0|  
         +---+     +---+     +--+  

2)将头指向新节点:

         +---+  
p_new -->| C |  
head  -->|   |
         +---+  
           |  
           V  
         +---+     +---+     +--+  
         | A | --> | B | --> |/0|  
         +---+     +---+     +--+  

在C 中,这看起来像:

Node * p_node = new Node;
p_node->next = head; // Step 1.
head = p_node; // Step 2.

我们可以通过简单代码在C 中创建新的头:

ListNode* dummy = new ListNode(0);
dummy->next = head;