【C++初阶】list的模拟实现 附源码
发布人:shili8
发布时间:2025-01-17 13:29
阅读次数:0
**C++ 初阶:List 的模拟实现**
在 C++ 中,`std::list` 是一个双向链表容器,它提供了高效的插入、删除和查找元素的功能。然而,在实际开发中,我们可能需要自己实现一个类似于 `std::list` 的数据结构来满足特定的需求。在本文中,我们将模拟实现一个简单的双向链表,并且附带源码。
### 模拟实现原理我们的模拟实现基于以下基本概念:
* **结点(Node)**:每个结点代表一个元素,包含两个指针分别指向前一个结点和后一个结点。
* **头结点(Head Node)** 和 **尾结点(Tail Node)**:头结点指向链表的第一个元素,而尾结点指向最后一个元素。
### 模拟实现源码
cpp#include <iostream>
// 结点类,包含两个指针分别指向前一个结点和后一个结点class Node {
public:
int data; // 元素值 Node* prev; // 前一个结点的指针 Node* next; // 后一个结点的指针 // 构造函数,初始化元素值、前一个结点和后一个结点 Node(int value) {
data = value;
prev = nullptr;
next = nullptr;
}
};
// 双向链表类,包含头结点、尾结点以及插入、删除等方法class DoublyLinkedList {
private:
Node* head; // 头结点的指针 Node* tail; // 尾结点的指针public:
// 构造函数,初始化头结点和尾结点 DoublyLinkedList() {
head = nullptr;
tail = nullptr;
}
// 销毁链表 ~DoublyLinkedList() {
while (head != nullptr) {
Node* temp = head;
head = head->next;
delete temp;
}
}
// 插入元素到头结点前面 void insertAtHead(int value) {
Node* newNode = new Node(value);
if (head == nullptr) {
head = newNode;
tail = newNode;
} else {
newNode->next = head;
head->prev = newNode;
head = newNode;
}
}
// 插入元素到尾结点后面 void insertAtTail(int value) {
Node* newNode = new Node(value);
if (tail == nullptr) {
head = newNode;
tail = newNode;
} else {
newNode->prev = tail;
tail->next = newNode;
tail = newNode;
}
}
// 删除头结点 void deleteHead() {
if (head != nullptr) {
Node* temp = head;
head = head->next;
if (head == nullptr) {
tail = nullptr;
} else {
head->prev = nullptr;
}
delete temp;
}
}
// 删除尾结点 void deleteTail() {
if (tail != nullptr) {
Node* temp = tail;
tail = tail->prev;
if (tail == nullptr) {
head = nullptr;
} else {
tail->next = nullptr;
}
delete temp;
}
}
// 打印链表 void printList() {
Node* temp = head;
while (temp != nullptr) {
std::cout << temp->data << " ";
temp = temp->next;
}
std::cout << std::endl;
}
};
int main() {
DoublyLinkedList list;
// 插入元素 list.insertAtHead(10);
list.insertAtTail(20);
list.insertAtHead(5);
list.insertAtTail(15);
// 打印链表 list.printList(); // 输出:51020 // 删除头结点 list.deleteHead();
// 打印链表 list.printList(); // 输出:1020 return0;
}
在这个例子中,我们定义了一个 `Node` 类来代表每个元素,包含两个指针分别指向前一个结点和后一个结点。然后我们定义了一个 `DoublyLinkedList` 类来模拟实现双向链表的功能。
### 模拟实现方法* **insertAtHead(int value)**:插入元素到头结点前面。
* **insertAtTail(int value)**:插入元素到尾结点后面。
* **deleteHead()**:删除头结点。
* **deleteTail()**:删除尾结点。
### 模拟实现源码注释
cpp// 结点类,包含两个指针分别指向前一个结点和后一个结点class Node {
public:
int data; // 元素值 Node* prev; // 前一个结点的指针 Node* next; // 后一个结点的指针 // 构造函数,初始化元素值、前一个结点和后一个结点 Node(int value) {
data = value;
prev = nullptr;
next = nullptr;
}
};
// 双向链表类,包含头结点、尾结点以及插入、删除等方法class DoublyLinkedList {
private:
Node* head; // 头结点的指针 Node* tail; // 尾结点的指针public:
// 构造函数,初始化头结点和尾结点 DoublyLinkedList() {
head = nullptr;
tail = nullptr;
}
// 销毁链表 ~DoublyLinkedList() {
while (head != nullptr) {
Node* temp = head;
head = head->next;
delete temp;
}
}
// 插入元素到头结点前面 void insertAtHead(int value) {
Node* newNode = new Node(value);
if (head == nullptr) {
head = newNode;
tail = newNode;
} else {
newNode->next = head;
head->prev = newNode;
head = newNode;
}
}
// 插入元素到尾结点后面 void insertAtTail(int value) {
Node* newNode = new Node(value);
if (tail == nullptr) {
head = newNode;
tail = newNode;
} else {
newNode->prev = tail;
tail->next = newNode;
tail = newNode;
}
}
// 删除头结点 void deleteHead() {
if (head != nullptr) {
Node* temp = head;
head = head->next;
if (head == nullptr) {
tail = nullptr;
} else {
head->prev = nullptr;
}
delete temp;
}
}
// 删除尾结点 void deleteTail() {
if (tail != nullptr) {
Node* temp = tail;
tail = tail->prev;
if (tail == nullptr) {
head = nullptr;
} else {
tail->next = nullptr;
}
delete temp;
}
}
// 打印链表 void printList() {
Node* temp = head;
while (temp != nullptr) {
std::cout << temp->data << " ";
temp = temp->next;
}
std::cout << std::endl;
}
};
在这个例子中,我们定义了一个 `Node` 类来代表每个元素,包含两个指针分别指向前一个结点和后一个结点。然后我们定义了一个 `DoublyLinkedList` 类来模拟实现双向链表的功能。
### 模拟实现方法* **insertAtHead(int value)**:插入元素到头结点前面。
* **insertAtTail(int value)**:插入元素到尾结点后面。
* **deleteHead()**:删除头结点。
* **deleteTail()**:删除尾结点。
### 模拟实现源码注释
cpp// 结点类,包含两个指针分别指向前一个结点和后一个结点class Node {
public:
int data; // 元素值 Node* prev; // 前一个结点的指针 Node* next; // 后一个结点的指针 // 构造函数,初始化元素值、前一个结点和后一个结点 Node(int value) {
data = value;
prev = nullptr;
next = nullptr;
}
};
// 双向链表类,包含头结点、尾结点以及插入、删除等方法class DoublyLinkedList {
private:
Node* head; // 头结点的指针 Node* tail; // 尾结点的指针public:
// 构造

