双链表的建立,初始化,查找元素位置,删除,插入元素,添加链表元素
时间: 2024-10-21 19:06:01 浏览: 35
ListLink.rar_stl list_单链表_单链表 插入 删除 查找_链表 插入
双链表(Doubly Linked List)是一种数据结构,其中每个节点包含两个指针,分别指向前一个节点和后一个节点。这使得我们可以从两个方向遍历列表,即向前和向后。
**1. 双链表的建立(Initialization)**:
创建一个双链表首先需要定义一个节点结构,通常包括数据域和两个指针域:
```cpp
struct Node {
int data;
Node* prev; // 指向前一个节点
Node* next; // 指向后一个节点
};
```
建立链表时,你可以创建一个头结点,然后为其他元素分配新的节点:
```cpp
Node* head = new Node{0, nullptr, nullptr}; // 初始化空链表的头结点
```
**2. 查找元素位置(Searching for an element)**:
查找元素时,你需要从头结点开始逐个比较节点的数据直到找到匹配项或遍历到链表末尾:
```cpp
int findElement(Node* current, int value) {
while (current != nullptr && current->data != value) {
current = current->next;
}
return current != nullptr ? current->data : -1; // 如果找到返回值,否则返回-1表示未找到
}
```
**3. 删除元素(Deleting an element)**:
删除元素首先需要找到该元素的前一个节点,然后更新它的`next`指针指向被删除元素的下一个节点,如果被删除的是头结点,还需要处理特殊情况:
```cpp
void deleteNode(Node*& head, int value) {
if (head == nullptr) return;
if (head->data == value) { // 如果是头节点
Node* temp = head;
head = head->next;
delete temp;
} else {
Node* current = head;
while (current->next != nullptr && current->next->data != value) {
current = current->next;
}
if (current->next != nullptr) {
current->next = current->next->next;
delete current->next;
}
}
}
```
**4. 插入元素(Inserting an element)**:
在指定位置插入新元素,先找到插入位置的前一个节点,然后插入新节点:
```cpp
void insertNode(Node*& head, int value, int position) {
if (position <= 0) {
Node* newNode = new Node{value, nullptr, head};
head = newNode;
return;
}
Node* current = head;
for (int i = 0; i < position - 1 && current != nullptr; ++i) {
current = current->next;
}
if (current != nullptr) {
newNode = new Node{value, current, current->next};
current->next = newNode;
} else {
std::cout << "Invalid insertion position" << std::endl;
}
}
```
**5. 添加链表元素(Adding an element to the end of the list)**:
向链表末尾添加元素可以直接设置当前节点的`next`指针:
```cpp
void appendNode(Node*& head, int value) {
if (head == nullptr) {
head = new Node{value, nullptr, nullptr};
return;
}
Node* newNode = new Node{value, nullptr, nullptr};
newNode->prev = head->prev;
newNode->next = head;
if (head->prev != nullptr) {
head->prev->next = newNode;
} else {
head->prev = newNode;
}
head->prev = newNode;
}
```
阅读全文