C++程序 分组反转链表 – 第一部分

C++程序 分组反转链表 – 第一部分

在编写C++程序时,经常需要操作链表来存储和处理数据。链表是一个重要的数据结构,它可以用来实现栈、队列、队列等常见的数据结构。在链表的基础上,可以实现更复杂的数据结构,如树、图等。

本篇文章将介绍如何使用C++实现链表分组反转的功能。具体来说,我们将实现一个函数,输入链表和一个整数k,将链表分成长度为k的若干组,然后将每一组的元素反转。最后,将所有的组合在一起,重新构成一个新的链表并返回。

数据结构定义和初始化

我们首先需要定义链表的基本数据结构,并初始化测试数据。

#include<iostream>
using namespace std;

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

int main(void) {
    ListNode* head = new ListNode(1);
    ListNode* curr = head;
    for (int i = 2; i <= 5; i++) {
        ListNode* node = new ListNode(i);
        curr->next = node;
        curr = node;
    }
    return 0;
}

上述代码用于创建一个5个元素的链表。

逻辑实现和代码

首先,我们需要确定链表的长度,这可以通过遍历链表来实现。我们还需要明确每个组的起始节点和结束节点,这可以通过计算来实现。接下来,我们需要将每个组内的元素反转,这可以通过遍历组内的元素来实现。

ListNode* reverseKGroup(ListNode* head, int k) {
    ListNode* dummy = new ListNode(-1);
    dummy->next = head;
    ListNode* prev = dummy;

    int len = 0;
    for (ListNode* p = head; p != NULL; p = p->next) len++;

    while (len >= k) {
        ListNode* curr = prev->next;
        ListNode* tail = curr;
        for (int i = 1; i < k; i++) {
            tail = tail->next;
        }
        for (int i = 1; i < k; i++) {
            ListNode* temp = curr->next;
            curr->next = temp->next;
            temp->next = prev->next;
            prev->next = temp;
        }
        prev = curr;
        len -= k;
    }

    return dummy->next;
}

完整代码

#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* dummy = new ListNode(-1);
    dummy->next = head;
    ListNode* prev = dummy;

    int len = 0;
    for (ListNode* p = head; p != NULL; p = p->next) len++;

    while (len >= k) {
        ListNode* curr = prev->next;
        ListNode* tail = curr;
        for (int i = 1; i < k; i++) {
            tail = tail->next;
        }
        for (int i = 1; i < k; i++) {
            ListNode* temp = curr->next;
            curr->next = temp->next;
            temp->next = prev->next;
            prev->next = temp;
        }
        prev = curr;
        len -= k;
    }

    return dummy->next;
}

int main(void) {
    ListNode* head = new ListNode(1);
    ListNode* curr = head;
    for (int i = 2; i <= 5; i++) {
        ListNode* node = new ListNode(i);
        curr->next = node;
        curr = node;
    }

    ListNode* p = reverseKGroup(head, 2);
    while (p != NULL) {
        cout << p->val << " ";
        p = p->next;
    }

    return 0;
}

结论

本篇文章介绍了如何使用C++实现链表分组反转的功能。我们定义了链表的基本数据结构,并初始化了测试数据。接着,我们实现了一个函数,用于将链表分成长度为k的若干组,然后将每一组的元素反转。最后,将所有的组合在一起,重新构成一个新的链表并返回。

希望通过本文的介绍,读者们可以熟练掌握C++中链表的操作,同时也能够更好地理解和应用链表这一重要的数据结构。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程

C++ 示例