一、题目
题目:25. K 个一组翻转链表
难度:困难
地址:https://leetcode-cn.com/problems/reverse-nodes-in-k-group/
使用语言:Java
二、代码
/**
反转区间[a,b)的元素,包含a但是不包括b(此处是闭区间)
**/
public ListNode reverse(ListNode a,ListNode b){
// 因为要反转区间[a,b),所以其前置节点为null
ListNode pre = null;
// a表示反转的第一个节点,b为反转区间的最后一个节点
ListNode cur = a;
ListNode next = a;
// 当当前指针没有指到最后一个节点时 循环不会结束
while(cur != b){
// 指针往后面移动 将当前指针指向节点引用赋值给next 保存节点
next = cur.next;
// 指针往后面移动 将前置节点赋值给当前节点的下一个 开始进行交换
cur.next = pre;
pre = cur;
cur = next;
}
return pre;
}
public ListNode reverseKGroup(ListNode head, int k) {
ListNode a = head;
ListNode b = head;
// 区间[a,b)包含k个待反转运元素
if(head == null){
return null;
}
// 根据反转数字 通过for循环 找到区间的右区间
for(int i = 0;i < k;i++){
if(b == null){
return head;
}
b = b.next;
}
// 使用递归 反转前k个元素
ListNode newHead = reverse(a,b);
// 将反转后的链表连接在一起
a.next = reverseKGroup(b,k);
return newHead;
}