leetcode K 个一组翻转链表 困难

题目例子图片比较多,贴题目链接:

https://leetcode-cn.com/problems/reverse-nodes-in-k-group/

 

思路:每 k 个一组将链表划分开,然后进行翻转链表,翻转完成后,再用上一次翻转的尾结点连接上。

第一次翻转时由于没有上一次翻转的尾结点,所以用一个虚拟结点来连接。

在最后,余留的部分,就直接不翻转进行连接即可。

class Solution {
public:
    ListNode* reverseKGroup(ListNode* head, int k) {
        if(k == 1) return head;     // k == 1 直接特判
        ListNode *virtualHead = new ListNode;   // 虚拟结点
        ListNode *retHead = virtualHead;
        ListNode *first;
        int cnt = 0;
        while(head) {
            ++ cnt;
            if(cnt % k == 1) first = head;      // 翻转要用
            ListNode *nxt = head -> next;
            if(cnt % k == 0) {
                head -> next = nullptr;         // 把 k 个一组的链表分开
                auto ret = reverseList(first);
                virtualHead -> next = ret.second;   // 上一次翻转的尾结点 连接上这一次翻转完成后的头结点
                virtualHead = ret.first;        // 更新
            }
            head = nxt;
        }
        if(cnt % k != 0) {      // 余留的不足 k 个结点的, 直接用上次翻转的尾结点连接上这次的头结点
            virtualHead -> next = first;
        }
        ListNode *ret = retHead -> next;
        delete retHead;
        return ret;
    }

private:
    pair<ListNode *, ListNode *> reverseList(ListNode *head) {     // first, second: 翻转后的链表尾 和 链表头
        ListNode *pre = nullptr;
        ListNode *first = head;
        while(head) {
            auto nxt = head -> next;
            head -> next = pre;
            pre = head;
            head = nxt;
        }
        return {first, pre};
    }
};

 

leetcode K 个一组翻转链表 困难

上一篇:k8s之数据存储-配置存储


下一篇:django 重建一个表