• 链表中的节点每k个一组翻转


    描述

    将给出的链表中的节点每 k 个一组翻转,返回翻转后的链表
    如果链表中的节点数不是 k 的倍数,将最后剩下的节点保持原样
    你不能更改节点中的值,只能更改节点本身。

    数据范围: \ 0 \le n \le 2000 0≤n≤2000 , 1 \le k \le 20001≤k≤2000 ,链表中每个元素都满足 0 \le val \le 10000≤val≤1000
    要求空间复杂度 O(1)O(1),时间复杂度 O(n)O(n)

    例如:

    给定的链表是 1\to2\to3\to4\to51→2→3→4→5

    对于 k = 2k=2 , 你应该返回 2\to 1\to 4\to 3\to 52→1→4→3→5

    对于 k = 3k=3 , 你应该返回 3\to2 \to1 \to 4\to 53→2→1→4→5


    本题已AC


     解题思路:

            拿到这题,一个想法就是用栈来写。至于为什么我会想到用栈呢?因为需要反向嘛,这里我看题目的要求,空间复杂度为 O(1)。第一个想法是保存值,通过 new一个新的节点了实现。但是仔细一想,好像不可以的,因为这样空间复杂度肯定不符合,突然灵机一动,我们可以用栈保存节点是指针,nice.

            1→23→4→5   k = 2时 

            1→2→3→4→5   k = 3时   

            4和5是不用翻转的,所以如果用栈又会带来一个问题,因为栈结构是先进后出的,如果用栈来保存肯定会导致,4,5也会被翻转。

            这里有两个解决方法,

            1.把4,5再次入栈(入另一个栈),然后再输出 ok

            2.不妨我们不使用栈结构,我们使用双向队列(而且双向队列在前后两端进行插入删除的效率也挺高的,所以我们使用这个结构最佳了)

            我们哪一个例子来看:

            1→2→3→4→5   k = 3时   

            准备工作,一个指向该链表的指针 head。一个deque,一个中间变量 tmpk

            一些方便操作的辅助指针 s和ans

           

     

     

     

     

     这里我们做一个循环,while(head != nullptr)     是的,一次遍历就可以搞定

     

     此时退出循环,okk

    判断 que是否为空或者tmpk是否等于 0

    如果que不为空的话,说明que此时的节点是不需要翻转的

    所以

     那么这题就ok了,当然题目有一些细节,这个只能根据实际的测试清空来修改了

    比如  {},2     {1,2},3    {1},2等

    附上我通过的代码:

    1. class Solution {
    2. public:
    3. /**
    4. *
    5. * @param head ListNode类
    6. * @param k int整型
    7. * @return ListNode类
    8. */
    9. ListNode* reverseKGroup(ListNode* head, int k) {
    10. // write code here
    11. deque sta;
    12. int tmpk = k;
    13. ListNode *s = nullptr;
    14. ListNode *ans = nullptr;
    15. while(head != nullptr)
    16. {
    17. sta.push_back(head);
    18. head = head->next;
    19. tmpk--;
    20. if(tmpk == 0)
    21. {
    22. if(s == nullptr)
    23. {
    24. s = sta.back();
    25. sta.pop_back();
    26. ans = s;
    27. }
    28. while(!sta.empty())
    29. {
    30. s->next = sta.back();
    31. sta.pop_back();
    32. s = s->next;
    33. }
    34. tmpk = k;
    35. }
    36. }
    37. while(!sta.empty())
    38. {
    39. if(s == nullptr)
    40. {
    41. s = sta.front();
    42. sta.pop_front();
    43. ans = s;
    44. }
    45. else
    46. {
    47. s->next = sta.front();
    48. sta.pop_front();
    49. s= s->next;
    50. }
    51. }
    52. if(s != nullptr)
    53. s->next = nullptr;
    54. return ans;
    55. }
    56. };

      

     

  • 相关阅读:
    typeScript 学习笔记(二)
    【RPA实战】 中秋节月饼不知道买哪种?UiPath零代码2分钟获取1000种月饼商品信息告诉你答案
    ZZNUOJ_C语言1114:逆序(完整代码)
    使用 SolidJS 和 TypeScript 构建任务跟踪器
    VMware安装Android-x86示例
    解决Python requests库中的重定向问题
    Slipper —— 虚点,最短路
    【JVM】Java的四种引用详解
    Java字符串String、StringBuffer、StringBuilder的异同
    【Java面试题】AQS为什么要使用双向链表?
  • 原文地址:https://blog.csdn.net/weixin_46120107/article/details/126203107