📜  用于反转双向链表的 C++ 程序(1)

📅  最后修改于: 2023-12-03 15:27:10.539000             🧑  作者: Mango

反转双向链表的 C++ 程序介绍

什么是双向链表?

双向链表是一种链表数据结构,每个节点包含两个指针:一个指向前一个节点,一个指向后一个节点。因此该数据结构可以从前向后或者从后向前遍历,相比单向链表更具有灵活性。

什么是反转链表?

反转链表即将链表中的元素按照相反的顺序排列。对于单向链表而言,常常通过遍历链表,将每个节点的指针方向进行调整实现反转;对于双向链表,则需要同时调整前驱节点和后继节点的指针方向才能实现反转。

C++ 程序实现

下面是用于反转双向链表的 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函数中定义了两个指针prevcurr,通过遍历循环将链表元素进行反转。最后在main函数中,创建一个包含5个节点的链表,用cout输出反转前后的链表元素。