题目
解题
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
// 构建三个节点,辅助,且不改变原来的head链表
ListNode dummy = new ListNode(0);
dummy.next = head;
ListNode preStart = dummy;
ListNode start = head;
// 一直遍历到需要进行反转的点
for (int i = 1; i < m; i ++ ) {
preStart = start;
start = start.next;
}
// 此时pre 在第m-1个位置 和 start 在第m个位置上
/**
开始翻转,这里的逻辑有点像冒泡,但又不是,只是神似
*/
// 操作的次数仅需要n-m+1次即可,因为就这么多个数据需要翻转
for(int i=0 ;i<n-m;i++){
/**
翻转的逻辑是将temp不断地插入到prestart后面,
temp必须是整理过的:永远是当前start结点指的那个节点
*/
ListNode temp = start.next;
start.next = temp.next;
temp.next = preStart.next;
preStart.next = temp;
}
// 这样head 列表也不会改变,这里的解题思路的核心是添加了两个辅助节点 和 通过类似原地翻转的逻辑思路实现翻转/
return dummy.next;
}
}