📅  最后修改于: 2023-12-03 15:14:04.643000             🧑  作者: Mango
双向链表是一种常见的数据结构,它由多个节点组成,其中每个节点都含有指向前一个节点和后一个节点的指针。本文将介绍如何通过C++程序将双向链表旋转N个节点。
在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个节点。通过本文所述的算法和代码实现,您可以轻松地处理这种问题。