• 每日OJ题_链表⑤_力扣25. K 个一组翻转链表


    目录

    力扣25. K 个一组翻转链表

    解析代码


    力扣25. K 个一组翻转链表

    25. K 个一组翻转链表

    难度 困难

    给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。

    k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。

    你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。

    示例 1:

    输入:head = [1,2,3,4,5], k = 2
    输出:[2,1,4,3,5]
    

    示例 2:

    输入:head = [1,2,3,4,5], k = 3
    输出:[3,2,1,4,5]
    

    提示:

    • 链表中的节点数目为 n
    • 1 <= k <= n <= 5000
    • 0 <= Node.val <= 1000

    进阶:你可以设计一个只用 O(1) 额外内存空间的算法解决此问题吗?

    1. /**
    2. * Definition for singly-linked list.
    3. * struct ListNode {
    4. * int val;
    5. * ListNode *next;
    6. * ListNode() : val(0), next(nullptr) {}
    7. * ListNode(int x) : val(x), next(nullptr) {}
    8. * ListNode(int x, ListNode *next) : val(x), next(next) {}
    9. * };
    10. */
    11. class Solution {
    12. public:
    13. ListNode* reverseKGroup(ListNode* head, int k) {
    14. }
    15. };

    解析代码

            可以把链表按 K 个为一组进行分组,组内进行反转,并且记录反转后的头尾结点,使其可以和前后连接起来。先求出⼀共需要逆序多少组(假设逆序 n 组),然后重复 n 次长度为 k 的链表的逆序即可。

    1. /**
    2. * Definition for singly-linked list.
    3. * struct ListNode {
    4. * int val;
    5. * ListNode *next;
    6. * ListNode() : val(0), next(nullptr) {}
    7. * ListNode(int x) : val(x), next(nullptr) {}
    8. * ListNode(int x, ListNode *next) : val(x), next(next) {}
    9. * };
    10. */
    11. class Solution {
    12. public:
    13. ListNode* reverseKGroup(ListNode* head, int k) {
    14. int n = 0;
    15. ListNode* cur = head;
    16. while(cur)
    17. {
    18. cur = cur->next;
    19. ++n;
    20. }
    21. n /= k;
    22. cur = head;
    23. ListNode* newHead = new ListNode();
    24. ListNode* prev = newHead;
    25. while(n--)
    26. {
    27. ListNode* tmp = cur;
    28. int cnt = k;
    29. while(cnt--)
    30. {
    31. ListNode* prevNext = cur->next;
    32. cur->next = prev->next; // cur头插到prev
    33. prev->next = cur;
    34. cur = prevNext;
    35. }
    36. prev = tmp;
    37. }
    38. prev->next = cur;
    39. cur = newHead->next;
    40. delete newHead;
    41. return cur;
    42. }
    43. };
  • 相关阅读:
    拒绝遗忘:高效的动态规划算法
    学习线程池原理从手写一个线程池开始
    Pinia的使用
    数据结构——lesson5栈和队列详解
    SMBMS系统_准备工作
    [小程序技能树]路由跳转
    Webpack 5 超详细解读(一)
    11.22Spring 学习day02
    vue基础知识(三)
    RHCE学习 --- 第一次作业
  • 原文地址:https://blog.csdn.net/GRrtx/article/details/136502726