BM2 链表内指定区间反转


提示:以下是本篇文章正文内容,下面案例可供参考

一、题目

在这里插入图片描述

二、代码

代码如下(示例):

import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 *   public ListNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param head ListNode类 
     * @param m int整型 
     * @param n int整型 
     * @return ListNode类
     */
    public ListNode reverseBetween (ListNode head, int m, int n) {
        // write code here
        ListNode first = head, last = head;
        ListNode pre = null;
        
        // 这边是查找区间范围,区间第一个指针和最后一个指针
        int i = 1;
        while(i < m){
            pre = first;
            first = first.next;
            i++;
        }
        i = 1;
        while(i < n){
            last = last.next;
            i++;
        }
        //记录
        ListNode lastNext = last.next;
        first = reverse(first,last);
        first.next = lastNext;
        if(pre != null){
            pre.next = last;
        }
        // 这里有个特殊情况,如果 m==1,那么头节点就被反转了
        // 说明这个时候区间尾节点就是新的头节点
        if(m==1){
            return last;
        }
        return head;
    }


    public ListNode reverse(ListNode cur,ListNode last){
     	// 这是个递归函数
     	// 其实这个函数是返回 cur 本身节点
     	// 但是返回之前需要把 cur 之后的节点全部进行反转
     	// 如果当前节点是区间尾节点或者 null,就开始递归。
     	// 不继续找下节点
        if(cur == null || cur == last){
            return cur;
        }
		// 反转 cur 之后的节点,返回下一个节点本身
        ListNode next = reverse(cur.next,last);
        // 反转
        next.next = cur;
        // 返回本身
        return cur;
    }
}

三、图解释

在这里插入图片描述

这边通过递归函数 reverse 把 first 和 last 之间(包含 first 和 last)的节点全部反转

---

总结

这种题目一定要画图来找思路,好好理解递归思想。大家一起加油~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值