📅  最后修改于: 2023-12-03 15:27:10.539000             🧑  作者: Mango
双向链表是一种链表数据结构,每个节点包含两个指针:一个指向前一个节点,一个指向后一个节点。因此该数据结构可以从前向后或者从后向前遍历,相比单向链表更具有灵活性。
反转链表即将链表中的元素按照相反的顺序排列。对于单向链表而言,常常通过遍历链表,将每个节点的指针方向进行调整实现反转;对于双向链表,则需要同时调整前驱节点和后继节点的指针方向才能实现反转。
下面是用于反转双向链表的 C++ 程序,其中包含链表节点的定义、链表元素反转的函数以及一个简单的测试样例。
#include<iostream>
using namespace std;
//定义链表节点格式
struct ListNode {
int data;
ListNode* next;
ListNode* prev;
};
//定义链表元素反转函数
ListNode* reverseList(ListNode* head) {
ListNode* prev = nullptr;
ListNode* curr = head;
while (curr) {
ListNode* next = curr->next;
curr->next = prev;
curr->prev = next;
prev = curr;
curr = next;
}
return prev;
}
//定义测试样例
int main(){
//创建链表节点并赋值
ListNode* head = new ListNode();
head->data = 0;
ListNode* curr = head;
for (int i = 1; i <= 5; i++) {
ListNode* next = new ListNode();
next->data = i;
curr->next = next;
next->prev = curr;
curr = next;
}
//输出反转前的链表元素值
curr = head;
cout << "Before Reverse: ";
while (curr) {
cout << curr->data << " ";
curr = curr->next;
}
//调用反转函数反转链表
ListNode* newHead = reverseList(head);
//输出反转后的链表元素值
curr = newHead;
cout << "\nAfter Reverse: ";
while (curr) {
cout << curr->data << " ";
curr = curr->next;
}
return 0;
}
以上程序中,使用struct ListNode
定义了链表节点格式,并在reverseList
函数中定义了两个指针prev
与curr
,通过遍历循环将链表元素进行反转。最后在main
函数中,创建一个包含5个节点的链表,用cout
输出反转前后的链表元素。