• LeetCode刷题系列 -- 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]

    来源:力扣(LeetCode)
    链接:https://leetcode.cn/problems/reverse-nodes-in-k-group
     

    思路:

    如何 K 个一组反转链表 :: labuladong的算法小抄

    c++

    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. // [a, b)
    14. ListNode* reverseListNodes(ListNode* a, ListNode* b) {
    15. ListNode* pre = nullptr;
    16. ListNode* currNode = a;
    17. ListNode* nxtNode = a;
    18. while(currNode != b) {
    19. nxtNode = currNode->next;
    20. currNode->next = pre;
    21. pre = currNode;
    22. currNode = nxtNode;
    23. }
    24. return pre;
    25. }
    26. ListNode* reverseKGroup(ListNode* head, int k) {
    27. ListNode* left = head;
    28. ListNode* right = head;
    29. int count = 0;
    30. while(count<k) {
    31. // 剩余链表长度不足 k 时,直接把剩余链表的头部返回
    32. if(right == nullptr) {
    33. return head;
    34. }
    35. right = right->next;
    36. count++;
    37. }
    38. ListNode* newHead = reverseListNodes(left,right);
    39. ListNode* lastNode= reverseKGroup(right,k);
    40. left->next = lastNode;
    41. return newHead;
    42. }
    43. };

    java:

    1. /**
    2. * Definition for singly-linked list.
    3. * public class ListNode {
    4. * int val;
    5. * ListNode next;
    6. * ListNode() {}
    7. * ListNode(int val) { this.val = val; }
    8. * ListNode(int val, ListNode next) { this.val = val; this.next = next; }
    9. * }
    10. */
    11. class Solution {
    12. // [left, right)
    13. public ListNode reverseListNodes(ListNode left, ListNode right) {
    14. ListNode first = left;
    15. ListNode second = left.next;
    16. while(second != right) {
    17. ListNode tmp = first;
    18. first = second;
    19. second = second.next;
    20. first.next = tmp;
    21. }
    22. return first;
    23. }
    24. public ListNode reverseKGroup(ListNode head, int k) {
    25. ListNode left = head;
    26. ListNode right = head;
    27. int count = 0;
    28. while(right != null) {
    29. count++;
    30. right = right.next;
    31. if(count == k) {
    32. break;
    33. }
    34. }
    35. // 最后剩余的节点保持原有顺序
    36. if(count < k) {
    37. return left;
    38. }
    39. ListNode newHead = reverseListNodes(left, right);
    40. ListNode lastNode = reverseKGroup(right, k);
    41. left.next = lastNode;
    42. return newHead;
    43. }
    44. }

  • 相关阅读:
    温故而知新三(C++)
    浅谈 K8S 网络模型CNI协议
    Linux文件目录相关指令
    SpringBoot 使用 Redisson
    VIVADO+FPGA调试记录
    Java 的 String、StringBuffer 和 StringBuilder(一文讲透)
    Spring注解驱动之BeanPostProcessor后置处理器详解
    zdpgo_gin_limit 为zdpgo_gin打造的接口限流框架,当API接口需要限制访问频率的时候可以使用此框架
    Linux学习之HTTP
    Vue项目中,el-image实现按钮触发大图预览模式
  • 原文地址:https://blog.csdn.net/qq_33775774/article/details/127697960