提示:以下是本篇文章正文内容,下面案例可供参考
一、题目
二、代码
代码如下(示例):
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)的节点全部反转
---总结
这种题目一定要画图来找思路,好好理解递归思想。大家一起加油~