LC的Shopee面试题库(翻转链表的进阶版)|刷题打卡

761 阅读1分钟

一、题目描述:

CLVK(QGMBJX8C.png

二、思路分析:

翻转链表应该是很多人都做过的面试题了,这里给没做过的简单说下

指针pre = null,next = head.next, tmp = head;

循环tmp-> next = pre; pre = tmp;tmp = next;next = tmp->next;

return tmp

而这个k组翻转其实就是先将链表分为:未翻转,正在翻转,已经翻转三部分,循环一遍得到。

三、AC 代码:

/**
 * 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);
    dummy.next = head;

    ListNode pre = dummy;
    ListNode end = dummy;

    while (end.next != null) {
        for (int i = 0; i < k && end != null; i++) end = end.next;
        if (end == null) break;
        ListNode start = pre.next;
        ListNode next = end.next;
        end.next = null;
        pre.next = reverse(start);
        start.next = next;
        pre = start;

        end = pre;
    }
    return dummy.next;
}

private ListNode reverse(ListNode head) {
    ListNode pre = null;
    ListNode curr = head;
    while (curr != null) {
        ListNode next = curr.next;
        curr.next = pre;
        pre = curr;
        curr = next;
    }
    return pre;
}

}

四、总结:

这是一道困难题,我在会翻转链表的前提下还是没做出来,题解中前驱节点dummy的设置我觉得十分的妙,(虽然这个在翻转链表里也出现过),只是当初只是当模板背的,并没有吃透该知识点

本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情