[LeetCode Hot 100] LeetCode25. K个一组翻转链表

发布时间 2023-12-11 21:11:37作者: Ac_c0mpany丶

题目描述

思路:

  1. 判断链表中是否足够k个元素
  2. 再将这k个元素内部翻转一下
  3. 将前后端点连接的指针变化一下


方法一:

/**
 * 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 p = dummy;
        while(p != null) {
            ListNode q = p;
            // 判断后面是否有k个节点
            for (int i = 0; i < k && q != null; i ++) q = q.next;
            if (q == null) break;
            // 后面有k个节点
            ListNode a = p.next, b = a.next;
            // 翻转内部
            for (int i = 0; i < k - 1; i ++) {
                ListNode temp = b.next;
                b.next = a; 
                a = b;
                b = temp;
            }
            // 翻转外部
            ListNode c = p.next;
            p.next = a;
            c.next = b;
            p = c;
        }
        return dummy.next;
    }
}