每天一道算法题

LeetCode第25题:翻转链表 K个数为一组

这道题初看有点难,其实可以拆解。我们将链表按K拆解为多个子链表,子链表各自翻转之后拼接到一起即可,具体的可以看代码注释。

/**
     * 这里思路是遍历链表,截取指定长度的链表整个翻转,同时记录首尾节点,之后拼接起来就行
     */
    public static ListNode reverseKGroup(ListNode head, int k) {
        if (head == null || head.next == null || k < 2) {
            return head;
        }
        int i = k - 1;
        // 虚拟空节点,最终返回使用
        ListNode ans = new ListNode(0);
        // 这个节点用来记录翻转后的尾节点用于与下个翻转后的节点拼接
        ListNode node = ans;
        // 当前的头节点,翻转后就是当前序列的尾节点
        ListNode last = head;
        // 记录一下当前翻转后需要处理的下一个节点
        ListNode next;
        while (head != null) {
            head = head.next;
            if (head == null) {
                node.next = last;
                break;
            }
            if (--i == 0) {
                i = k - 1;
                next = head.next;
                head.next = null;
                node.next = reverse(last);
                node = last;
                head = next;
                last = head;
            }

        }

        return ans.next;
    }

    /**
     * 传进来的链表整个翻转
     */
    private static ListNode reverse(ListNode head) {
        ListNode link = new ListNode(0, head.next);
        ListNode cur = head.next;
        head.next = null;
        while (cur != null) {
            ListNode next = cur.next;
            cur.next = head;
            link.next = cur;

            cur = next;
            head = link.next;
        }
        return link.next;
    }

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容