K个一组反转链表
只能使用常数的额外空间,因此只能用迭代法。关键点是用for循环,每k个反转一次,每次反转前要记下头结点的前一个结点和尾结点的后一个结点,用于拼接。
class Solution {
public ListNode reverseKGroup(ListNode head, int k) {
ListNode dummy = new ListNode(0);
dummy.next = head;
ListNode pre = dummy;
ListNode end = dummy;
while(end.next != null) {
for(int i = 0; i < k && end != null; i++) end = end.next;
if(end == null) break;
ListNode next = end.next;
ListNode start = pre.next;
end.next = null;
pre.next = reverse(start);
start.next = next;
pre = start;
end = pre;
}
return dummy.next;
}
private ListNode reverse(ListNode head) {
ListNode pre = null;
ListNode curr = head;
while (curr != null) {
ListNode next = curr.next;
curr.next = pre;
pre = curr;
curr = next;
}
return pre;
}
}