1. 题目
2. 分析
之前我们做过一个反转链表,这里在满足两个的情况下,我们可以复用之前的反转链表能力。 反转链表
然后我们需要考虑,怎么才能做到,每k个反转一下,这里我们拿题目的第一个case,第一次反转举例:
-
首先我们需要有一个标识,标识我现在积累了几个节点了,根据这个标识判断是否进行反转,即图中的c。
-
然后我们定义一个newNode,最终返回newNode的next
-
然后我们需要一个pre,表示新链表的最后一个节点,减少每次从newNode遍历
-
然后是一个start,标识需要反转的起始节点
-
然后是next,反转链表的时候需要断掉head的next,所以需要next来存一下
3. 最终代码
public ListNode reverseKGroup(ListNode head, int k) {
ListNode newHead = new ListNode(0);
int c = 1;
ListNode next = null;
ListNode pre = newHead;
ListNode start = head;
while (head != null) {
if (c == k) {
next = head.next;
head.next = null;
reverseList(start);
pre.next = head;
pre = start;
start = next;
head = next;
} else {
head = head.next;
c++;
}
}
if (c > 1) {
pre.next = next;
}
return newHead.next;
}
4. 小感悟
这种链表类的题目,靠脑子想,比较费劲,但是如果我们画一个图,然后图上操作一步,再写一句代码,就会变得很简单。