链表c++(链表存储结构)
## C++链表详解### 简介链表是一种常见的数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。与数组不同,链表的内存空间不必连续,这使得它在插入和删除元素方面具有更高的效率。### 链表的类型C++ 中常见的链表类型有:
单链表:
每个节点包含一个数据元素和一个指向下一个节点的指针。
双链表:
每个节点包含一个数据元素、一个指向前一个节点的指针和一个指向下一个节点的指针。
循环链表:
尾节点的指针指向头节点,形成一个环。### 单链表#### 定义节点结构体```cpp struct Node {int data;Node
next; }; ```#### 创建链表```cpp Node
createLinkedList(int arr[], int n) {Node
head = nullptr;Node
tail = nullptr;for (int i = 0; i < n; i++) {Node
newNode = new Node;newNode->data = arr[i];newNode->next = nullptr;if (head == nullptr) {head = newNode;tail = newNode;} else {tail->next = newNode;tail = newNode;}}return head; } ```#### 插入节点
头部插入:
```cpp void insertAtHead(Node
headRef, int newData) {Node
newNode = new Node;newNode->data = newData;newNode->next =
headRef;
headRef = newNode; } ```
中间插入:
```cpp void insertAfter(Node
prevNode, int newData) {if (prevNode == nullptr) {cout << "The given previous node cannot be NULL";return;}Node
newNode = new Node;newNode->data = newData;newNode->next = prevNode->next;prevNode->next = newNode; } ```
尾部插入:
```cpp void insertAtTail(Node
headRef, int newData) {Node
newNode = new Node;newNode->data = newData;newNode->next = nullptr;if (
headRef == nullptr) {
headRef = newNode;return;}Node
last =
headRef;while (last->next != nullptr) {last = last->next;}last->next = newNode; } ```#### 删除节点```cpp void deleteNode(Node
headRef, int key) {Node
temp =
headRef,
prev = nullptr;if (temp != nullptr && temp->data == key) {
headRef = temp->next;delete temp;return;}while (temp != nullptr && temp->data != key) {prev = temp;temp = temp->next;}if (temp == nullptr) return;prev->next = temp->next;delete temp; } ```#### 遍历链表```cpp void printList(Node
node) {while (node != nullptr) {cout << node->data << " ";node = node->next;} } ```### 双链表双链表与单链表类似,但每个节点还包含一个指向前一个节点的指针。#### 定义节点结构体```cpp struct Node {int data;Node
prev;Node
next; }; ```#### 双链表的操作双链表的操作与单链表类似,但在插入和删除节点时需要同时更新两个指针。### 循环链表循环链表是尾节点指向头节点的链表。#### 循环链表的操作循环链表的操作与单链表类似,但需要注意边界条件。### 总结链表是一种灵活的数据结构,它在插入和删除元素方面具有优势。C++ 提供了多种链表类型,可以根据实际需求选择合适的类型。
C++链表详解
简介链表是一种常见的数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。与数组不同,链表的内存空间不必连续,这使得它在插入和删除元素方面具有更高的效率。
链表的类型C++ 中常见的链表类型有:* **单链表:** 每个节点包含一个数据元素和一个指向下一个节点的指针。 * **双链表:** 每个节点包含一个数据元素、一个指向前一个节点的指针和一个指向下一个节点的指针。 * **循环链表:** 尾节点的指针指向头节点,形成一个环。
单链表
定义节点结构体```cpp struct Node {int data;Node* next; }; ```
创建链表```cpp Node* createLinkedList(int arr[], int n) {Node* head = nullptr;Node* tail = nullptr;for (int i = 0; i < n; i++) {Node* newNode = new Node;newNode->data = arr[i];newNode->next = nullptr;if (head == nullptr) {head = newNode;tail = newNode;} else {tail->next = newNode;tail = newNode;}}return head; } ```
插入节点* **头部插入:**```cpp void insertAtHead(Node** headRef, int newData) {Node* newNode = new Node;newNode->data = newData;newNode->next = *headRef;*headRef = newNode; } ```* **中间插入:**```cpp void insertAfter(Node* prevNode, int newData) {if (prevNode == nullptr) {cout << "The given previous node cannot be NULL";return;}Node* newNode = new Node;newNode->data = newData;newNode->next = prevNode->next;prevNode->next = newNode; } ```* **尾部插入:**```cpp void insertAtTail(Node** headRef, int newData) {Node* newNode = new Node;newNode->data = newData;newNode->next = nullptr;if (*headRef == nullptr) {*headRef = newNode;return;}Node* last = *headRef;while (last->next != nullptr) {last = last->next;}last->next = newNode; } ```
删除节点```cpp void deleteNode(Node** headRef, int key) {Node* temp = *headRef, *prev = nullptr;if (temp != nullptr && temp->data == key) {*headRef = temp->next;delete temp;return;}while (temp != nullptr && temp->data != key) {prev = temp;temp = temp->next;}if (temp == nullptr) return;prev->next = temp->next;delete temp; } ```
遍历链表```cpp void printList(Node* node) {while (node != nullptr) {cout << node->data << " ";node = node->next;} } ```
双链表双链表与单链表类似,但每个节点还包含一个指向前一个节点的指针。
定义节点结构体```cpp struct Node {int data;Node* prev;Node* next; }; ```
双链表的操作双链表的操作与单链表类似,但在插入和删除节点时需要同时更新两个指针。
循环链表循环链表是尾节点指向头节点的链表。
循环链表的操作循环链表的操作与单链表类似,但需要注意边界条件。
总结链表是一种灵活的数据结构,它在插入和删除元素方面具有优势。C++ 提供了多种链表类型,可以根据实际需求选择合适的类型。