题目: K 个一组翻转链表
来自智得网
分析
链表的操作比数组的操作更加复杂,数组可以直接将某个值根据下标放在某个位置。
链表必须通过指针的交换才能完成反转。
K个一组翻转链表和两两交换链表中的节点题目类似,题解分为两个步骤:
将一组K个结点进行翻转,链表的翻转过程涉及到三个指针,当前指针,前序指针以及后续指针,将当前指针的next指向前序指针,将后续指针指向当前指针,然后将前序指针,当前指针以及后续指针向后移动。
上述一组指针完成反转之后,将新的尾结点和链表其他部分链接即可,链表其他部分可以采用递归的方式继续上述过程。
public class Solution {
static class ListNode{
private Object value;
private ListNode next;
}
public static ListNode solute(ListNode head, int k) {
if (head == null) return null;
ListNode begin, end;
begin = end = head;
for (int i = 0; i < k; i++) {
if (end == null) return head;
end = end.next;
}
ListNode last = reverse(begin, end);
begin.next = solute(end, k);
return last;
}
// 反转区间内的结点
private static ListNode reverse(ListNode a, ListNode b) {
ListNode pre, curr, next;
pre = null;
curr = a;
while (curr != b) {
next = curr.next;
curr.next = pre;
pre = curr;
curr = next;
}
return pre;
}
}