• 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. }

  • 相关阅读:
    Qt事件、自定义事件、事件过滤、发送事件
    定时任务调度中心简单竞品分析
    vue打包后vue-router无内容
    《MySQL学习笔记》数据库增删查改(进阶)
    Vue实现分页功能
    WorldCoin 运营数据,业务安全分析
    JavaScript 基础1:变量与数据类型及其转换
    离散事件仿真原理DES
    火狐拖放后,总会默认打开百度搜索,如果是图片,则会打开图片。
    MYSQL 表名作为变量时,必须使用 ${ }
  • 原文地址:https://blog.csdn.net/qq_33775774/article/details/127697960