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

题目描述
将给出的链表中的节点每 k\ k k 个一组翻转,返回翻转后的链表
如果链表中的节点数不是 k\ k k 的倍数,将最后剩下的节点保持原样
你不能更改节点中的值,只能更改节点本身。
要求空间复杂度 O(1)\ O(1) O(1)
例如:
给定的链表是1→2→3→4→51\to2\to3\to4\to51→2→3→4→5
对于 k=2\ k = 2 k=2, 你应该返回 2→1→4→3→52\to 1\to 4\to 3\to 52→1→4→3→5
对于 k=3\ k = 3 k=3, 你应该返回 3→2→1→4→53\to2 \to1 \to 4\to 53→2→1→4→5

示例1
输入
{1,2,3,4,5},2

返回值
{2,1,4,3,5}

这道题我想了一天了,,菜鸡本鸡了
记录一下解题思路:

首先,K个节点为一组,然后进行反转。首先,我想到的办法是用一个栈的结构,输入k个为一组,然后按照出栈顺序进行重新组建链表。如果没有下一个节点加入栈,那么将站内已有的元素进行组建。但是,牛客告诉我,时间复杂度太高了。
那么,就开动聪明的小脑瓜想下一个好办法!!

k个节点为一组进行反转,那么利用头插法,给组的头部声明一个变量(要插入的位置),把每组内遍历到的每一个节点都插到h的前边。
然后,问题来了,,,
如果输入(1,2)3,就是每三个一组进行反转,要得到的结果为(1,2),就是对链表不进行改动。那该怎么弄!!我再想想办法。
我想到一个一个函数叫做rollback,可以返回到事情发生前,但是老是找不着,,百度一下,原来是因为rollback这个函数适用于事物提交的回滚的。在Spring框架操作数据库的过程中,如果事物提交发生错误,那么就rollback来保护我们的数据。方法不可行×。
继续思考。。
后来发现不足k个是不需要反转的,数据结构教会我做人。。
真心要哭了。。
这个样子的话,那么我们就需要先判断是否有k个元素存在,若存在,则反转,若不存在,则原样返回;
代码如下:

 public ListNode reverseKGroup(ListNode head, int k) {
     if (head == null || head.next == null) {
         return head;
     }
     ListNode tail = head;
     for (int i = 0; i < k; i++) {
         //剩余数量小于k的话,则不需要反转。
         if (tail == null) {
             return head;
         }
         tail = tail.next;
     }
     // 反转前 k 个元素
     ListNode newHead = reverse(head, tail);
     //下一轮的开始的地方就是tail
     head.next = reverseKGroup(tail, k);

     return newHead;
 }

 /*
 左闭又开区间
  */
 private ListNode reverse(ListNode head, ListNode tail) {
     ListNode pre = null;
     ListNode next = null;
     while (head != tail) {
         next = head.next;
         head.next = pre;
         pre = head;
         head = next;
     }
     return pre;

 }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值