1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| class Solution { public ListNode reverseKGroup(ListNode head, int k) { if (k == 1) return head; ListNode currHead = head, nextHead = head; ListNode prevTail = new ListNode(0), dummy = prevTail; while (currHead != null) { int count = 0; while (count < k && nextHead != null) { nextHead = nextHead.next; count += 1; } if (nextHead == null && count < k) { prevTail.next = currHead; break; } ListNode newHead = reverse(currHead, k); prevTail.next = newHead; prevTail = currHead; currHead = nextHead; } return dummy.next; }
private ListNode reverse(ListNode head, int k) { ListNode prev = null, curr = head; for (int i = 0; i < k; i++) { ListNode next = curr.next; curr.next = prev; prev = curr; curr = next; } return prev; } }
|
需要记录上一个group的end, 这个group的start以及下一个group的start.
我没想到的是如果走k次的过程中, 我们遇到了null, 这是分情况的. 一种是刚好走了k次到了null, 此时最后的group是刚好有k个node, 此时需要reverse; 另一种情况就是最后一个group不够k个node, 因此不需要reverse. 这也是23行干的事情.
还有就是reverse的时候, 我一开始直接傻乎乎的把整个list给reverse了, 但实际上应该只reverse当前group里的node. 同时我reverse后返回的东西还以为是返回curr, 其实在最后一次循环前curr已经更新到了下一个group的start. 因此我们还是应该返回prev.
时间复杂度: O(n)
空间复杂度: O(1)