码迷,mamicode.com
首页 > 编程语言 > 详细

leetcode25. K个一组翻转链表--每天刷一道leetcode算法系列!

时间:2020-12-10 10:37:56      阅读:6      评论:0      收藏:0      [点我收藏+]

标签:http   inf   mic   i++   算法   png   因此   交换   有序数组   

leetcode25. K个一组翻转链表--每天刷一道leetcode算法系列!?

技术图片

作者:reed,一个热爱技术的斜杠青年,程序员面试联合创始人

前文回顾:
leetcode1. 两数之和--每天刷一道leetcode系列!
leetcode2. 两数相加--每天刷一道leetcode系列!
leetcode3. 无重复字符的最长子串--每天刷一道leetcode系列!
leetcode4. 寻找两个有序数组的中位数--每天刷一道leetcode系列!
leetcode5.最长回文子串--每天刷一道leetcode系列!
leetcode9. 回文数--每天刷一道leetcode系列!
leetcode11. 盛最多水的容器--每天刷一道leetcode系列!
leetcode14. 最长公共前缀--每天刷一道leetcode算法题系列!
leetcode15. 三数之和--每天刷一道leetcode算法系列!
leetcode16. 最接近的三数之和--每天刷一道leetcode算法系列!
leetcode17. 电话号码的字母组合--每天刷一道leetcode算法系列!
leetcode18. 四数之和--每天刷一道leetcode算法系列!
leetcode19. 删除链表的倒数第N个节点--每天刷一道leetcode算法系列!
leetcode20. 括号生成--每天刷一道leetcode算法系列!
leetcode21. 合并两个有序链表--每天刷一道leetcode算法系列!
leetcode22. 括号生成--每天刷一道leetcode算法系列!
leetcode23. 合并K个排序链表--每天刷一道leetcode算法系列!
leetcode24. 两两交换链表中的节点--每天刷一道leetcode算法系列!
leetcode25. K个一组翻转链表--每天刷一道leetcode算法系列!(本篇)

题目描述

给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。k 是一个正整数,它的值小于或等于链表的长度。
如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
示例 :

给定这个链表:1->2->3->4->5
当 k = 2 时,应当返回: 2->1->4->3->5
当 k = 3 时,应当返回: 3->2->1->4->5

说明 :

你的算法只能使用常数的额外空间。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

分析

大致过程可以分解为
1、找到待翻转的k个节点(注意:若剩余数量小于k的话,则不需要反转,因此直接返回待翻转部分的头结点即可)。
2、对其进行翻转。并返回翻转后的头结点(注意:翻转为左闭又开区间,所以本轮操作的尾结点其实就是下一轮操作的头结点)。
3、对下一轮k个节点也进行翻转操作。
4、将上一轮翻转后的尾结点指向下一轮翻转后的头节点,即将每一轮翻转的k的节点连接起来。

具体过程看下图。

技术图片

代码


    public ListNode reverseKGroup(ListNode head, int k) {
            if (head == null || head.next == null) {
                    return head;
            }
            ListNode tail = head;
            for (int i = 0; i < k; i++) {
                    //剩余数量小于k的话,则不需要反转。
                    if (tail == null) {
                            return head;
                    }
                    tail = tail.next;
            }
            // 反转前 k 个元素
            ListNode newHead = reverse(head, tail);
            //下一轮的开始的地方就是tail
            head.next = reverseKGroup(tail, k);

            return newHead;
    }

    /*
    左闭又开区间
     */
    private ListNode reverse(ListNode head, ListNode tail) {
            ListNode pre = null;
            ListNode next = null;
            while (head != tail) {
                    next = head.next;
                    head.next = pre;
                    pre = head;
                    head = next;
            }
            return pre;

    }

leetcode25. K个一组翻转链表--每天刷一道leetcode算法系列!

标签:http   inf   mic   i++   算法   png   因此   交换   有序数组   

原文地址:https://blog.51cto.com/15047485/2559833

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!