题目

解题

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;}}