时间复杂度: O ( n ∗ k ) O(n*k) O(n∗k)
空间复杂度: O ( n ) O(n) O(n)
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode reverseKGroup(ListNode head, int k)
{
ListNode dummy = new ListNode(0, head);// 哨兵节点
ListNode pre = dummy;// 上一段最后一个节点
ListNode end = dummy;// 本段的最后一个节点
while (end.next != null)
{
// 找到当前段的尾节点end
for (int i = 0; i < k && end != null; i++)
end = end.next;
if (end == null)// 最后一段(长度 < n 的)不处理
break;
ListNode start = pre.next;// 上一段尾节点的 next 就是当前段的起始节点
ListNode next = end.next;// 先存着 后续段
end.next = null;// 断掉与 后续段 的联系
pre.next = reverse(start);// 对 当前段 进行翻转
start.next = next;// 翻转后当前段的尾节点是 start,在尾节点接上 后续段
pre = start;// 更新上一段的尾节点
end = pre;//跳过已经处理完的节点
}
return dummy.next;//返回哨兵指向的头结点
}
private ListNode reverse(ListNode head)
{
ListNode pre = null;
ListNode cur = head;
while (cur != null)//按顺序遍历,头插法 实现翻转
{
ListNode next = cur.next;
cur.next = pre;
pre = cur;
cur = next;
}
return pre;
}
}