alt

一次遍历,迭代算法解决链表指定区间反转

import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 * }
 */

public class Solution {
    /**
     * 
     * @param head ListNode类 
     * @param m int整型 
     * @param n int整型 
     * @return ListNode类
     */
    public ListNode reverseBetween (ListNode head, int m, int n) {
        //建立虚拟头节点,指向head,不用分开处理m==1和m!=1时的情况
        ListNode dummy=new ListNode(-1);
        dummy.next=head;
      
      //m1指向m-1的节点,初始为虚拟头节点dummy
      //cur初始指向head,表示当前节点
      //m2指向m位置的节点,初始为cur
      //i表示cur节点所在的位置,因为节点从1开始数,所以i初始为1
        ListNode m1=dummy;
        ListNode cur=head;
        ListNode m2=cur;
        int i=1;
        
      //从头遍历,直到cur指向m位置
      //每次循环依次更新m1、cur、m2
        while(i<m){
            m1=cur;
            cur = cur.next;
            m2=cur;
            i++;
        }
        
      //然后就跟迭代反转链表的操作一样了,只是循环判断条件改为i<=n
      //循环结束时,pre指向n位置,cur指向n+1位置
        ListNode pre=null;
        ListNode next=null;
        while(i<=n){
            next=cur.next;
            cur.next=pre;
            pre=cur;
            cur=next;
            i++;
        }
      
      //最后将m-1节点和m节点分别指向n和n+1,完成反转
        m1.next=pre;
        m2.next=cur;
        
        return dummy.next;
    }
}