codeTop100题(5)25. K 个一组翻转链表

76 阅读1分钟

1. 题目

25. K 个一组翻转链表

2. 分析

之前我们做过一个反转链表,这里在满足两个的情况下,我们可以复用之前的反转链表能力。 反转链表

然后我们需要考虑,怎么才能做到,每k个反转一下,这里我们拿题目的第一个case,第一次反转举例:

image.png

  • 首先我们需要有一个标识,标识我现在积累了几个节点了,根据这个标识判断是否进行反转,即图中的c。

  • 然后我们定义一个newNode,最终返回newNode的next

  • 然后我们需要一个pre,表示新链表的最后一个节点,减少每次从newNode遍历

  • 然后是一个start,标识需要反转的起始节点

  • 然后是next,反转链表的时候需要断掉head的next,所以需要next来存一下

3. 最终代码


public ListNode reverseKGroup(ListNode head, int k) {
    ListNode newHead = new ListNode(0);
    int c = 1;
    ListNode next = null;
    ListNode pre = newHead;
    ListNode start = head;
    while (head != null) {

        if (c == k) {
            next = head.next;
            head.next = null;
            reverseList(start);
            pre.next = head;
            pre = start;
            start = next;
            head = next;
        } else {
            head = head.next;
            c++;
        }
    }
    if (c > 1) {
        pre.next = next;
    }
    return newHead.next;
}

4. 小感悟

这种链表类的题目,靠脑子想,比较费劲,但是如果我们画一个图,然后图上操作一步,再写一句代码,就会变得很简单。