c++有一个带头结点的双链表L,设计一个算法将其所有元素逆置,即第1个元素变为最后一个元素,第2个元素变为倒数第2个元素,…,最后一个元素变为第1个元素。
时间: 2024-09-27 16:02:31 浏览: 52
在C++中,我们可以使用迭代或递归的方式实现将带头节点的双链表逆置。这里是一个基本的迭代方法:
```cpp
struct ListNode {
int val;
ListNode *next;
ListNode *prev; // 添加指向前一个节点的指针
};
// 函数用于交换两个节点的位置
void swapNodes(ListNode *&a, ListNode *&b) {
if (a == nullptr || b == nullptr)
return;
// 临时存储a的下一个节点
ListNode *temp = a->next;
// 更新a和b的连接
a->next = b;
b->prev = a;
// 如果b还有下一个节点,更新它们的连接
if (b->next != nullptr)
b->next->prev = a;
a->next = temp; // 将a恢复到原来的位置,如果有的话
}
// 主函数逆置整个链表
void reverseList(ListNode *&head) {
ListNode *current = head;
ListNode *prev = nullptr;
while (current != nullptr) {
// 保存当前节点的下一个节点
ListNode *nextTemp = current->next;
// 逆序操作
swapNodes(current, prev);
// 更新当前和前一个节点
current = nextTemp;
prev = current; // 现在prev指向新的"当前"节点
}
}
```
这个算法首先创建两个临时变量,一个存储当前节点的下一个节点,另一个作为临时存储位置。然后通过`swapNodes`函数交换当前节点和前一个节点的连接,并更新它们的指针。循环直到遍历完整个链表。
阅读全文