这段代码实现了在链表的开头插入新节点的功能。让我解释一下它的逻辑:
- 首先,它创建了一个新的节点
newNode
。 - 然后,将新节点的数据域设置为
newData
,即要插入的新数据。 - 接着,将新节点的指针域
next
指向当前的头节点head
。这样,新节点就成为了链表的新头节点,而原来的头节点成为了新节点的下一个节点。 - 最后,将头指针
head
更新为新插入的节点,以确保链表的头指针指向新的头节点。
在这段代码中,新节点 newNode
被插入到链表的开头。它的 next
指针被设置为当前链表的头节点(由 head
指向)。然后,head
指针被更新为新插入的节点 newNode
,以确保链表的头部正确更新。
#include <iostream>
using namespace std;struct Node {int data;Node* next;
};class LinkedList {
private:Node* head; // 头指针,指向链表的第一个节点public:LinkedList() {head = nullptr; // 初始时链表为空}// 在链表头部插入一个新节点// 创建一个新节点,并设置它的数据值。// 将新节点的 next 指针指向当前的第一个节点,使新节点成为新的第一个节点。// 更新头指针,使它指向新的第一个节点。void insertAtBeginning(int newData) {Node* newNode = new Node;newNode->data = newData;newNode->next = head; //这行代码将新节点的 next 指针指向当前的头节点,这样新节点就成为了链表的新头节点。head = newNode; //这行代码将头指针 head 更新为新插入的节点,以确保链表的头指针指向新的头节点。}// 删除链表中的第一个节点void deleteAtBeginning() {if (head == nullptr) {cout << "Linked list is empty. Cannot delete from an empty list." << endl;return;}Node* temp = head;head = head->next;delete temp;}// 打印链表的所有节点数据void printList() {Node* temp = head;cout << "Linked List: ";while (temp != nullptr) {cout << " "<< temp->data<< " " <<temp;temp = temp->next;}cout << endl;}
};int main() {LinkedList myList;myList.insertAtBeginning(3);myList.insertAtBeginning(7);myList.insertAtBeginning(9);myList.printList(); // 输出: Linked List: 9 7 3myList.deleteAtBeginning();myList.printList(); // 输出: Linked List: 7 3return 0;
}// 让我们来解释一下插入数据的顺序和头指针之间的关系。// 在单向链表中,头指针通常指向链表中的第一个节点。当我们要在链表的头部插入一个新节点时,我们需要进行以下步骤:// 创建一个新节点,并设置它的数据值。
// 将新节点的 next 指针指向当前的第一个节点,使新节点成为新的第一个节点。
// 更新头指针,使它指向新的第一个节点。
// 这样做的原因是,链表的头指针需要始终指向链表的第一个节点,以便我们能够轻松地访问整个链表。