📜  反转双向链表(1)

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

反转双向链表介绍

双向链表是一种常见的数据结构,相比单向链表,它多了一个指向前驱节点的指针,因此可以双向遍历。在实际开发中,经常需要对双向链表进行反转操作,即将原链表的顺序翻转,使得原本的末尾节点成为头节点,而原本的头节点成为末尾节点。

本文将介绍反转双向链表的实现思路及相关代码,以帮助程序员更好地掌握该操作。

实现思路

反转双向链表的基本思路是遍历原链表,逐个将节点的前驱指针和后继指针进行交换,最终得到一个翻转后的新链表。具体实现方式有以下两种:

1. 迭代法

迭代法是反转双向链表的最常见实现方法,它利用一个指针cur依次遍历原链表,对每个节点执行以下操作:

  1. 交换当前节点的前驱指针和后继指针;
  2. 将cur指针指向下一个节点。

重复执行以上操作,直到遍历完成。最终,原本的尾节点即成为了新链表的头节点。

迭代法代码如下(C++实现):

Node* reverseList(Node* head) {
    Node *cur = head, *tmp = nullptr;
    while (cur != nullptr) {
        tmp = cur->prev;
        cur->prev = cur->next;
        cur->next = tmp;
        cur = cur->prev;
    }
    if (tmp != nullptr) //原本的尾节点
        head = tmp->prev;
    return head;
}
2. 递归法

递归法是一种比较巧妙的实现方法,它将反转一个节点的前驱指针和后继指针转化为反转下一个节点的前驱指针和后继指针,然后利用递归的方式不断向后执行,直到反转到链表的末尾。

递归法代码如下(C++实现):

Node* reverseList(Node* head) {
    if (head == nullptr || head->next == nullptr)
        return head;
    Node* new_head = reverseList(head->next);
    head->next->prev = nullptr;
    head->next = nullptr;
    head->prev = new_head;
    if (new_head != nullptr)
        new_head->next = head;
    return head;
}
总结

反转双向链表是一道经典而又实用的算法问题,运用迭代法和递归法两种实现方式,可以达到解决此类问题的目的。程序员们需要牢记实现思路,根据实际情况选择相应的方法进行实现,以提高代码效率和可读性。