25. K 个一组翻转链表

题目

给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。
k 是一个正整数,它的值小于或等于链表的长度。
如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
进阶

  • 你可以设计一个只使用常数额外空间的算法来解决此问题吗?
  • 你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-nodes-in-k-group
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

public ListNode reverseKGroup(ListNode head, int k) {
	//快慢指针
    ListNode fast=head;
    ListNode slow=head;
    //快指针先走k个节点
    int i=0;
    for(;i<k;i++){
      if(fast!=null)
        fast=fast.next;
      else
        return head;
    }
    boolean flag=false;
    //指向要翻转的k个节点的头节点 并不是真的头节点 subHead.next才是
    ListNode subHead=new ListNode();
    //要翻转的k个节点的尾节点,用于指向下一个要翻转的子序列的头节点
    ListNode lastTail=new ListNode();
    //如果fast节点没走到头,获取刚刚好走到头,继续翻转
    while (fast!=null||i==k){
      subHead.next=slow;
      for(int j=1;j<k;j++){
        ListNode help=slow;
        help=help.next;
        slow.next=help.next;
        help.next=subHead.next;
        subHead.next=help;
        if(fast!=null)
          fast=fast.next;
      }
      //第一次以后的翻转,把前一次翻转的尾节点接到头节点上
      if(flag){
        lastTail.next=subHead.next;
      }
      //第一次翻转,把头节点 赋值个 head
      if(!flag){
        head=subHead.next;
        flag=true;
      }
      if(fast==null)
        return head;
      //翻转后的尾节点
      lastTail=slow;
      //到下一次翻转的头节点
      fast=fast.next;
      slow=slow.next;
    }
    return head;
  }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值