Skip to content

翻转每一段链表, 要有dummy, 找到每段链表翻转前的head, head.prev, last, last.next

java
class ListNode {
    int val;
    ListNode next;
    ListNode() {}
    ListNode(int val) { this.val = val; }
    ListNode(int val, ListNode next) { this.val = val; this.next = next; }
}
// @lc code=start
/**
 * 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 {
    /**
     * 翻转每一段链表, 要有dummy,
     * 找到每段链表翻转前的head, head.prev, last, last.next
     */
    public ListNode reverseKGroup(ListNode head, int k) {
        int len = 0;
        for (ListNode p = head; p != null; p = p.next)
            len++;

        ListNode dummy = new ListNode(-1, head);
        ListNode cur = head, prev = null, p0 = dummy;

        // 每k个是一组要翻转的list
        for (int i = k; i <= len; i+=k) {
            // 翻转list
            for (int j = 0; j < k; j++) {
                ListNode next = cur.next;
                cur.next = prev;
                prev = cur;
                cur = next;
            }

            // 衔接头尾
            // p0: 反转的链表的前一个节点
            // p0.next: 反转的链表的原先的head,现在的tail
            // cur: 下一个链表段的head
            // prev: 反转的链表的段的原先的tail, 现在的head
            ListNode nxt = p0.next;
            p0.next.next = cur;
            p0.next = prev;
            p0 = nxt;
        }
        return dummy.next;
    }
}

Personal Knowledge Base