分析:
1.链表指定区间内反转(区间二字,说明这个变化区间的前一个元素,以及区间最后一个元素的后一个指向是不会动的)
要求:改变变化区间前一个元素的尾部的指向
现有两种方案
方案一:将变化区间看为一个整体,先变化变化区间内部的元素位置,最后连接变化区间的头与尾
这种方案是将一个链表分成了两个大的部分,需要变化的部分(X)以及不需要变化的部分(Y),由于因为X,Y是会发生变化的,有的时候会非常的极端(当m=n这种情况),此时对于确定X区间的头的前一个元素以及X区间的尾的下一个元素是有很多不确定性的,因此,使用此种方法所写出来的代码大部分是没有普遍性的.
方案二:我们找到链表中需要变化部分(X)的第一个元素的位置,然后,我们将X中需要反转的元素以此放到第一个元素的前面,一共需要(n-m)次
例:链表为:12345 m=2,n=5 m-n=3
第一次: 13245
第二次: 14325
第三次: 15432
共三次
1.那就是说我们每次变化一次都需要改变元素值为"1"的元素的下一个元素的指向,那么我们就需要将元素值为"1"的这个元素的位置记录下来,并保持位置不变.
2.在变化的时候,我们会改变X的第一个元素(值为"2")的尾指向,以及值为"3"的元素的尾指向,由于此时若先改变值为"3"的元素的指向,该链表就会发生断链的问题,所以我们要先改变元素值为"2"的元素的尾指向.
3.按照以上规律循环(m-n)次即可
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) {
ListNode dummy = new ListNode(-1);
dummy.next = head;
ListNode pre = dummy;
for(int i= 1;i<m;i++){
pre = pre.next;
}
ListNode cur = pre.next;
ListNode temp = null;
for(int i = 0;i<(n-m);i++){
temp = cur.next;
cur.next = temp.next;
temp.next = pre.next;
pre.next = temp;
}
return dummy.next;
}
}