能否提供一个双向链表中如何与前驱节点进行交换操作的详细C/C++代码示例?
时间: 2024-11-06 10:23:51 浏览: 6
在双向链表中,每个节点通常包含一个指向下一个节点的指针以及一个指向前一个节点的指针。进行前驱节点交换的操作,需要访问当前节点的前一个节点,并将它们的指针指向对方。下面是一个简单的C++代码示例:
```cpp
#include <iostream>
// 定义双向链表节点结构体
struct Node {
int data;
Node* next;
Node* prev; // 前一个节点指针
Node(int value) : data(value), next(nullptr), prev(nullptr) {}
};
// 插入节点到链表中
void insert(Node*& head, int value) {
Node* newNode = new Node(value);
if (head == nullptr) {
head = newNode;
} else {
newNode->prev = head;
head->next = newNode;
head = newNode;
}
}
// 交换前驱节点
void swapPredecessor(Node*& currentNode) {
if (currentNode->prev != nullptr) { // 避免头部节点
std::swap(currentNode->data, currentNode->prev->data);
std::swap(currentNode->prev, currentNode->prev->prev); // 交换指针
}
}
int main() {
Node* listHead = nullptr;
insert(listHead, 5); // 初始链表: 5 -> NULL
insert(listHead, 3); // 链表变为: 3 -> 5 -> NULL
insert(listHead, 7); // 链表变为: 3 -> 5 -> 7 -> NULL
Node* thirdNode = listHead->next->next;
std::cout << "Before swap: ";
printList(listHead); // 打印链表
swapPredecessor(thirdNode); // 交换第三个节点的前驱节点(即第二个节点)
std::cout << "After swap: ";
printList(listHead); // 再次打印链表
return 0;
}
// 辅助函数用于打印链表
void printList(Node* node) {
while (node != nullptr) {
std::cout << node->data << " ";
node = node->next;
}
std::cout << "\n";
}
阅读全文