码迷,mamicode.com
首页 > 其他好文 > 详细

链表--K个一组反转链表(leetcode 25

时间:2020-06-23 22:59:04      阅读:103      评论:0      收藏:0      [点我收藏+]

标签:ext   rev   区间   group   https   return   大致   ever   思路   

解法

思路:

大致过程可以分解为

1、找到待翻转的k个节点(注意:若剩余数量小于 k 的话,则不需要反转,因此直接返回待翻转部分的头结点即可)。

2、对其进行翻转。并返回翻转后的头结点(注意:翻转为左闭又开区间,所以本轮操作的尾结点其实就是下一轮操作的头结点)。

3、对下一轮 k 个节点也进行翻转操作。

4、将上一轮翻转后的尾结点指向下一轮翻转后的头节点,即将每一轮翻转的k的节点连接起来。

技术图片

代码:

class Solution {
    public ListNode reverse(ListNode head, ListNode tail){
        //这个翻转链表不是reverseAll,也不是reversePart,是从head reverse到tail
        ListNode temp1 = null;
        ListNode temp = head;
        ListNode temp2;
        while (temp != tail){
            temp2 = temp.next;
            temp.next = temp1;
            temp1 = temp;
            temp = temp2;
        }

        return temp1;
    }

    public ListNode reverseKGroup(ListNode head, int k) {

        //先反转第一组的,因为要保存好newHead
        //用循环定位到tail
        ListNode tail = head;
        for (int i = 0; i < k; i++){
            if(tail == null){
                //如果该组的长度不够k,就不用翻转了,直接返回该组的head
                return head;
            }
            tail = tail.next;
        }
        //此时定位到要反转的部分了,从head到tail(不包括tail)
        //用newHead保存新的头
        ListNode newHead = reverse(head, tail);
        //此时head还是原始链表的头部,也就是翻转后第一组的尾部,用它去连接第二组
        //第二组的头部是tail
        head.next = reverseKGroup(tail, k);

        return newHead;

    }
}

链表--K个一组反转链表(leetcode 25

标签:ext   rev   区间   group   https   return   大致   ever   思路   

原文地址:https://www.cnblogs.com/swifthao/p/13184993.html

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