K个一组翻转链表
先背代码吧,周末再来优化,leetCode中的题目
/**
* @author: Maoc
* @date: 2024/8/28 23:04
* @description:K个一组链表翻转 总体逻辑:
* 一、找到k区间:若k区间小于k个数,则返回当前node
* 1.1、找出k范围最大的那个元素,如:0~k-1;k~2k-1
* 1.2、若k区间小于个数,则返回当前node的head
* 1.3、参数设置,开始startNode、endNode;注意,为了循环连贯性,endNode取k区间的下一个
* 二、实现k区间翻转
* 2.1、找出k范围最大的那个元素,如:0~k-1;k~2k-1
* 三、各区间的连贯
* 3.1、head指向第一个连贯k区间的endNode
* 3.2、设置一个lastNode记录上一个的结尾(即startNode),指向下一个区间的开头
**/
public class LeetCode95ReverserNodeInKGroup {
public static class ListNode {
public int val;
public ListNode next;
}
public static ListNode reverseKGrooup(ListNode head, int k) {
ListNode start = head;
ListNode end = getKNode(start, k);
if (start == null) {
return head;
}
head = end;
reverse(start, end);
ListNode lastNode = start;
while (lastNode.next != null) {
start = lastNode.next;
end = getKNode(start, k);
if (end == null) {
return head;
}
reverse(start, end);
lastNode.next = end;
lastNode = start;
}
return head;
}
private static ListNode getKNode(ListNode start, int k) {
while (--k != 0 && start != null) {
start = start.next;
}
return start;
}
private static void reverse(ListNode start, ListNode end) {
end = end.next;
ListNode pre = null;
ListNode current = start;
ListNode next = null;
while (current != end) {
next = current.next;
current.next = pre;
pre = current;
current = next;
}
start.next = end;
}
}
反思&总结
持续更新的第五天,效果真的一般,进入比较难的区域了,又要综合上班和平时时间