Skip to content

LeetCode 25:K 个一组翻转链表(Java)

LeetCode 25:K 个一组翻转链表(Java)

Section titled “LeetCode 25:K 个一组翻转链表(Java)”

力扣(中国)https://leetcode.cn/problems/reverse-nodes-in-k-group/

给链表,每 k 个节点一组做翻转。

例如:

1 -> 2 -> 3 -> 4 -> 5, k = 2

结果是:

2 -> 1 -> 4 -> 3 -> 5

如果最后剩下不足 k 个,就保持原样。

这题难点不在“反转”,而在“分组”。

步骤是:

  1. 每次先检查当前这一组够不够 k
  2. 如果不够,直接结束
  3. 如果够,就把这一组单独翻转
  4. 再把翻转后的这组接回去

图示:

dummy -> 1 -> 2 -> 3 -> 4 -> 5
先找出 [1,2]
翻转成 [2,1]
再接回原链表
public class Solution {
static class ListNode {
int val;
ListNode next;
ListNode(int val) {
this.val = val;
}
}
public ListNode reverseKGroup(ListNode head, int k) {
ListNode dummy = new ListNode(0);
dummy.next = head;
ListNode groupPrev = dummy;
while (true) {
ListNode kth = getKthNode(groupPrev, k);
if (kth == null) {
break;
}
ListNode groupNext = kth.next;
ListNode prev = groupNext;
ListNode cur = groupPrev.next;
while (cur != groupNext) {
ListNode next = cur.next;
cur.next = prev;
prev = cur;
cur = next;
}
ListNode oldGroupHead = groupPrev.next;
groupPrev.next = kth;
groupPrev = oldGroupHead;
}
return dummy.next;
}
private ListNode getKthNode(ListNode start, int k) {
while (start != null && k > 0) {
start = start.next;
k--;
}
return start;
}
}
  • 时间复杂度:O(n)
  • 空间复杂度:O(1)
我每次先找当前分组的第 k 个节点,如果不足 k 个就结束。
如果够,就把这一组链表原地翻转,再把前后指针重新接好。
为了处理头节点,我用了 dummy 节点统一逻辑。
先看够不够 k 个,够了再整组翻