C++程序 单链表中交替K节点翻转

C++程序 单链表中交替K节点翻转

问题描述

给定一个单链表和一个数字K,在单链表中交替翻转每K个节点。换句话说,将每K个节点翻转,但前K个节点不变,接下来的K个节点翻转,然后再接下来的K个节点不变,以此类推。

例如,对于链表1->2->3->4->5->6->7和K=3,应该返回链表3->2->1->6->5->4->7。

解决方案

我们可以使用一个递归方案来解决此问题。我们将链表分为前K个节点和后面的节点。将前K个节点翻转,并将其余部分递归地解决,然后将两个部分连接起来。

让我们看看如何实现递归函数。

ListNode* reverseKGroup(ListNode* head, int k) {
    ListNode* curr = head;
    int count = 0;
    while (curr != nullptr && count != k) {
        curr = curr->next;
        count++;
    }
    if (count == k) {
        curr = reverseKGroup(curr, k);
        while (count-- > 0) {
            ListNode* tmp = head->next;
            head->next = curr;
            curr = head;
            head = tmp;
        }
        head = curr;
    }
    return head;
}

在上面的递归函数中,我们首先统计链表中的前k个节点,然后我们递归地解决剩余的节点,并返回反转后的第一个节点。
接下来,我们将前K个节点反转。这可以通过翻转节点的指针来完成。一旦我们完成前K个节点的反转,我们将其连接到余下的部分,并返回反转后的第一个节点,如下所示:

if (count == k) {
    curr = reverseKGroup(curr, k);
    while (count-- > 0) {
        ListNode* tmp = head->next;
        head->next = curr;
        curr = head;
        head = tmp;
    }
    head = curr;
}

完整代码

以下是完整的C++实现,包括单链表的基本定义。使用输入和输出输出链表,测试上述方案。

#include <iostream>
using namespace std;

struct ListNode {
    int val;
    ListNode* next;
    ListNode(int x) : val(x), next(NULL) {}
};

ListNode* reverseKGroup(ListNode* head, int k) {
    ListNode* curr = head;
    int count = 0;
    while (curr != nullptr && count != k) {
        curr = curr->next;
        count++;
    }
    if (count == k) {
        curr = reverseKGroup(curr, k);
        while (count-- > 0) {
            ListNode* tmp = head->next;
            head->next = curr;
            curr = head;
            head = tmp;
        }
        head = curr;
    }
    return head;
}

void printList(ListNode* head) {
    while (head != NULL) {
        cout << head->val << " ";
        head = head->next;
    }
    cout << endl;
}

int main() {
    ListNode* head = new ListNode(1);
    head->next = new ListNode(2);
    head->next->next = new ListNode(3);
    head->next->next->next = new ListNode(4);
    head->next->next->next->next = new ListNode(5);
    head->next->next->next->next->next = new ListNode(6);
    head->next->next->next->next->next->next = new ListNode(7);

    int k = 3;

    cout << "Original list: ";
    printList(head);

    head = reverseKGroup(head, k);

    cout << "Reversed " << k << " nodes in groups: ";
    printList(head);

    return 0;
}

输出将是:

Original list: 1 2 3 4 5 6 7 
Reversed 3 nodes in groups: 3 2 1 6 5 4 7 

结论

在这篇文章中,我们通过递归实现了C++单链表中交替K节点翻转程序。代码实现简单,但需要理解递归的实现过程。注意在代码中,我们需要考虑处理链表剩余部分时的边界情况,比如链表不足K个节点的情况。希望本文能对有相应需求的读者有一定帮助。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程

C++ 示例