反转链表K:反转链表K通常指的是将链表中的每K个节点作为一组进行反转,如果剩余节点不足K个则保持原样。
以下是反转链表K的详细步骤和代码实现:
反转链表K的步骤- 初始化:创建一个虚拟头节点(dummy node)指向链表的头节点,以便于处理反转后的链表连接。
- 计算链表长度:遍历链表,计算其总长度。
- 确定反转组数:根据K的值和链表长度,确定可以完整反转的组数。
- 逐组反转:
对于每一组,使用三个指针(prev、first、second)进行反转。
反转完成后,将反转后的子链表连接到已处理的部分。
- 处理剩余节点:如果剩余节点不足K个,则保持原样。
- 返回结果:返回反转后的链表头节点。
代码实现#include <iostream>using namespace std;struct node { int x; node* next; node(int _x, node* _p) : x(_x), next(_p) {}};node* reverseKLink(node* head, int K) { if (head == nullptr || head->next == nullptr || K <= 1) { return head; } node* dummy = new node(0, head); node* prev = dummy; node* curr = head; node* next = nullptr; int length = 0; while (curr != nullptr) { length++; curr = curr->next; } curr = head; for (int i = 0; i < length / K; i++) { node* first = curr; node* second = curr->next; for (int j = 0; j < K - 1; j++) { next = second->next; second->next = first; first = second; second = next; } prev->next = first; curr->next = second; prev = curr; curr = second; } node* result = dummy->next; delete dummy; return result;}int main(int argc, char const *argv[]) { node* head = new node(1, new node(2, new node(3, new node(4, new node(5, new node(6, nullptr)))))); node* proot = reverseKLink(head, 2); while (proot != nullptr) { cout << "node:" << proot->x << " "; proot = proot->next; } cout << endl; return 0;}代码解释初始化:
创建虚拟头节点dummy,其next指向链表头节点head。
初始化prev、curr、next指针,用于后续反转操作。
计算链表长度:
遍历链表,计算总长度length。
逐组反转:
使用外层循环控制反转的组数(length / K)。
内层循环负责反转每一组的K个节点:
first指向当前组的第一个节点,second指向第二个节点。
通过调整指针方向,将second节点插入到first节点之前,实现反转。
反转完成后,调整prev和curr指针,连接到下一组的起始节点。
返回结果:
返回虚拟头节点的next,即反转后的链表头节点。
释放虚拟头节点的内存。
示例输出对于输入链表1->2->3->4->5->6和K=2,输出为:
node:2 node:1 node:4 node:3 node:6 node:5即链表被反转为2->1->4->3->6->5。