一、题目描述

二、算法原理

思路:

1)计算要逆序的链表对

2)创建一个哨兵位,分别把要逆序的结点头插到这个哨兵位上

插入完一对逆序对之后:

再头插到 prev 结点的后面:

3)把除链表逆序对的结点插入到这个哨兵位的最后结点上

三、代码实现

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* reverseKGroup(ListNode* head, int k) {
        //计算链表的长度
        int length = 0;
        ListNode* node = head;
        while(node)
        {
            length++;
            node = node->next;
        }
        //计算要逆序链表中的对数
        int size = length / k;
        ListNode* head2 = new ListNode(0);//哨兵位
        ListNode* prev = head2;//头插的位置
        ListNode* cur = head;
        int num = 0;//记录插入的个数
        while(size)
        {
            prev->next = cur;
            ListNode* next_prev = cur;//下一个头插的结点
            ListNode* tmp = cur->next;
            cur->next = nullptr;
            num++;
            cur = tmp;
            while(num != k)
            {
                tmp = prev->next;
                prev->next = cur;
                num++;
                ListNode* next_cur = cur->next;
                cur->next = tmp;
                cur = next_cur;
            }
            prev = next_prev;
            num = 0;
            size--;//每逆行一对就减一
        }

        if(cur) prev->next = cur;//连接逆转之后剩余的结点
        ListNode* result = head2->next;
        delete head2;
        return result;
    }
};

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐