golang,go,博客,开源,编程
单向链表(Singly Linked List)是一种链式数据结构,其中的每个节点包含两个部分:数据和指向下一个节点的指针。单向链表中的每个节点只能向前指向下一个节点,无法向后访问,意味着只能从链表的头部开始遍历,直到最后一个节点。
单向链表的节点通常包含以下两个部分:
Head → Node1 → Node2 → Node3 → Null
在这个示意图中:
Head
是链表的头节点。next
指针指向下一个节点。next
指针为 Null
,表示链表的结尾。#include <iostream>
using namespace std;
// 单向链表节点
struct Node {
int data; // 节点数据
Node* next; // 指向下一个节点
};
// 单向链表类
class SinglyLinkedList {
public:
Node* head; // 链表头指针
SinglyLinkedList() {
head = nullptr;
}
// 在链表头部插入新节点
void insertAtHead(int value) {
Node* newNode = new Node();
newNode->data = value;
newNode->next = head; // 新节点指向当前的头节点
head = newNode; // 更新头指针
}
// 在链表尾部插入新节点
void insertAtTail(int value) {
Node* newNode = new Node();
newNode->data = value;
newNode->next = nullptr;
if (head == nullptr) {
head = newNode; // 如果链表为空,新的节点成为头节点
} else {
Node* temp = head;
while (temp->next != nullptr) {
temp = temp->next;
}
temp->next = newNode; // 将新节点插入到链表的末尾
}
}
// 打印链表
void printList() {
Node* temp = head;
while (temp != nullptr) {
cout << temp->data << " ";
temp = temp->next;
}
cout << endl;
}
// 删除指定节点(通过值)
void deleteNode(int value) {
if (head == nullptr) return; // 空链表
if (head->data == value) { // 如果是删除头节点
Node* temp = head;
head = head->next; // 将头指针移到下一个节点
delete temp;
return;
}
Node* temp = head;
while (temp->next != nullptr && temp->next->data != value) {
temp = temp->next;
}
if (temp->next == nullptr) {
cout << "Node not found!" << endl;
return;
}
Node* nodeToDelete = temp->next;
temp->next = temp->next->next; // 删除节点
delete nodeToDelete;
}
};
int main() {
SinglyLinkedList list;
// 插入节点
list.insertAtHead(10);
list.insertAtHead(20);
list.insertAtTail(30);
// 打印链表
cout << "Linked List: ";
list.printList(); // 输出: 20 10 30
// 删除节点
list.deleteNode(10);
cout << "Linked List after deletion: ";
list.printList(); // 输出: 20 30
return 0;
}
单向链表是一种简单且高效的链式数据结构,适用于一些不需要频繁反向遍历的场景。它的优点是结构简单,内存消耗较少,缺点是只能单向遍历,并且删除操作相对较慢。如果你的应用场景中不需要复杂的反向操作或删除操作,单向链表是一个不错的选择。
如果你有任何具体问题或其他内容需要进一步探讨,随时告诉我!