这段代码实现了在链表的开头插入新节点的功能。让我解释一下它的逻辑:
- 首先,它创建了一个新的节点
newNode
。 - 然后,将新节点的数据域设置为
newData
,即要插入的新数据。 - 接着,将新节点的指针域
next
指向当前的头节点head
。这样,新节点就成为了链表的新头节点,而原来的头节点成为了新节点的下一个节点。 - 最后,将头指针
head
更新为新插入的节点,以确保链表的头指针指向新的头节点。
在这段代码中,新节点 newNode
被插入到链表的开头。它的 next
指针被设置为当前链表的头节点(由 head
指向)。然后,head
指针被更新为新插入的节点 newNode
,以确保链表的头部正确更新。
cpp
#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 3
myList.deleteAtBeginning();
myList.printList(); // 输出: Linked List: 7 3
return 0;
}
// 让我们来解释一下插入数据的顺序和头指针之间的关系。
// 在单向链表中,头指针通常指向链表中的第一个节点。当我们要在链表的头部插入一个新节点时,我们需要进行以下步骤:
// 创建一个新节点,并设置它的数据值。
// 将新节点的 next 指针指向当前的第一个节点,使新节点成为新的第一个节点。
// 更新头指针,使它指向新的第一个节点。
// 这样做的原因是,链表的头指针需要始终指向链表的第一个节点,以便我们能够轻松地访问整个链表。