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


    解法

    思路:

    大致过程可以分解为

    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;
    
        }
    }
    
  • 相关阅读:
    微信公众平台开发(6) 微信退款接口
    shiro 认证和授权原理
    Shiro架构
    微信公众平台开发(5) 微信客服消息接口
    微信公众平台开发(4) 微信模板消息接口
    微信公众平台开发(3) 企业付款
    微信公众平台开发(1) 通用的工具类CommonUtil
    spring 源码构建
    springMvc配置拦截器无效
    IIdea使用CXF开发WebService
  • 原文地址:https://www.cnblogs.com/swifthao/p/13184993.html
Copyright © 2020-2023  润新知