📜  C++程序将双向链表旋转N个节点(1)

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

C++程序:双向链表旋转N个节点

双向链表是一种常见的数据结构,它由多个节点组成,其中每个节点都含有指向前一个节点和后一个节点的指针。本文将介绍如何通过C++程序将双向链表旋转N个节点。

算法思路
  1. 定位第N个节点,并将它作为新的链表首节点。
  2. 将原链表的最后一个节点连接到原链表的首节点。
  3. 将新链表的最后一个节点指向NULL。
代码实现

在C++中,我们可以定义一个双向链表节点的结构体,如下所示:

struct Node {
    int val;
    Node* prev;
    Node* next;

    Node(int v) : val(v), prev(nullptr), next(nullptr) {}
};

然后,我们需要编写一个递归函数来定位第N个节点:

Node* rotate(Node* head, int n) {
    if (head == nullptr) {  // 边界情况
        return nullptr;
    }
    Node* p = head;
    int count = 1;
    while (p->next != nullptr && count < n) {  // 找到第N个节点
        p = p->next;
        count++;
    }
    if (count < n) {  // N大于链表的长度
        return head;
    }
    Node* q = p;
    while (q->next != nullptr) {  // 找到原链表的最后一个节点
        q = q->next;
    }
    q->next = head;  // 将原链表的最后一个节点连接到原链表的首节点
    head->prev = q;  // 将原链表的首节点连接到原链表的最后一个节点
    p->prev->next = nullptr;  // 将连接点的前一个节点的next设为NULL,断开原链表
    p->prev = nullptr;  // 将新链表的首节点的prev设为NULL
    return p;  // 返回新链表的首节点
}
使用示例

以下是一个充分测试了程序正确性的使用示例:

int main() {
    Node* h1 = new Node(1);
    h1->next = new Node(2);
    h1->next->prev = h1;
    h1->next->next = new Node(3);
    h1->next->next->prev = h1->next;

    Node* h2 = rotate(h1, 2);

    while (h2 != nullptr) {
        std::cout << h2->val << " ";
        h2 = h2->next;
    }
    // output: 3 1 2

    delete h1;
    delete h2;

    return 0;
}
总结

本文介绍了如何通过C++程序将双向链表旋转N个节点。通过本文所述的算法和代码实现,您可以轻松地处理这种问题。