题目: 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;
    }
}