反转链表K

反转链表K
最新回答
ヤ偽妳變乖

2026-10-22 09:35:32

反转链表K:反转链表K通常指的是将链表中的每K个节点作为一组进行反转,如果剩余节点不足K个则保持原样。

以下是反转链表K的详细步骤和代码实现:

反转链表K的步骤
  1. 初始化:创建一个虚拟头节点(dummy node)指向链表的头节点,以便于处理反转后的链表连接。
  2. 计算链表长度:遍历链表,计算其总长度。
  3. 确定反转组数:根据K的值和链表长度,确定可以完整反转的组数。
  4. 逐组反转:

    对于每一组,使用三个指针(prev、first、second)进行反转。

    反转完成后,将反转后的子链表连接到已处理的部分。

  5. 处理剩余节点:如果剩余节点不足K个,则保持原样。
  6. 返回结果:返回反转后的链表头节点。
代码实现#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;}代码解释
  1. 初始化:

    创建虚拟头节点dummy,其next指向链表头节点head。

    初始化prev、curr、next指针,用于后续反转操作。

  2. 计算链表长度:

    遍历链表,计算总长度length。

  3. 逐组反转:

    使用外层循环控制反转的组数(length / K)。

    内层循环负责反转每一组的K个节点:

    first指向当前组的第一个节点,second指向第二个节点。

    通过调整指针方向,将second节点插入到first节点之前,实现反转。

    反转完成后,调整prev和curr指针,连接到下一组的起始节点。

  4. 返回结果:

    返回虚拟头节点的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。