LeetCode 25. K 个一组翻转链表(2025字节最新面试)

给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。

k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。

你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。

输入:head = [1,2,3,4,5], k = 2
输出:[2,1,4,3,5]

输入:head = [1,2,3,4,5], k = 3
输出:[3,2,1,4,5]

提示:

  • 链表中的节点数目为 n
  • 1 <= k <= n <= 5000
  • 0 <= Node.val <= 1000

/**
 * Definition for singly-linked list.
 * public class ListNode {
 * int val;
 * ListNode next;
 * ListNode() {}
 * ListNode(int val) { this.val = val; }
 * ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
     public ListNode reverseKGroup(ListNode head, int k) {
       // 
       //

       // preHead 的next 就是下一个 
       ListNode preHead = new ListNode(0,head);
       // 前一个的尾部  
       ListNode preTail = preHead;

       // 当前的头部
       ListNode cur = head;
        
       // 下一个链表的头部 
       ListNode nextStart = null;

       for (;cur!= null;) {
        // 说明当前组还有元素
        // 如果恰好成立,则说明不是null
           for (int i = 0 ; i <= k-1 ; i++) {
               // 第0个数据
               if (cur == null) {
                  preTail.next = nextStart;
                  // 返回head
                  return preHead.next;
               } else {
                  if (i != k-1) {
                   cur = cur.next;
                  }
               }

           }

           // 找到下一个开始,并断开连接
           System.out.println("-------");
           System.out.println(cur.val);
           System.out.println("-------");
           nextStart = cur.next ;
           cur.next  = null;

           // 翻转当前链表 
           preTail.next = reverse(head);
           //更新下一组节点的开始值
           preTail = head;
           head = nextStart;
           cur = nextStart;
       }
       return preHead.next;

    }       



    // 返回新的头节点

    public  ListNode reverse(ListNode head){

         ListNode pre  = null;
         ListNode cur = head;

         while (cur != null) {
            ListNode next = cur.next;
            cur.next = pre;
            pre = cur;
            cur = next;
         }
         return pre;
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值