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 static ListNode reverseBetween(ListNode head, int m, int n) {
        //m=n,直接返回
        if (m == n) {
            return head;
        }
        //统计节点数量
        int count = 0;
        ListNode node = head;
        while (node != null) {
            count++;
            node = node.next;
        }
        //参照上一题,把链表分成三部分
        //第一部分,是不需要翻转的

        ListNode node1 = head;
        //第二部分,需要翻转的部分
        ListNode node2;
        //第三部分,是不需要翻转的
        ListNode node3 = null;
        //当前对象
        ListNode currentNode = head;
        //序号
        int i = 1;
        ListNode preNode1 = head;
        ListNode temp1 = head;
        ListNode temp2;
        node2 = head;

        while (currentNode != null) {
            if (i == m - 1) {
                preNode1 = currentNode;
                temp1 = currentNode.next;
                currentNode.next = null;
                currentNode = temp1;
                i++;
                continue;
            }
            if (i == m) {
                node2 = currentNode;
            }
            if (i == n) {
                temp2 = currentNode.next;
                currentNode.next = null;
                currentNode = temp2;
                i++;
                continue;
            }
            if (i == n + 1) {
                node3 = currentNode;
            }
            currentNode = currentNode.next;
            i++;
        }
        ListNode reverseNode = reverseList(node2);
        if (m == 1) {
            //m=1时只有两部分(缺少第一部分),直接翻转第二部分连接第三部分就可以了
            if (node3 != null) {
                node2.next = node3;
            }
            return reverseNode;
        } else if (n == count) {
            //n==链表长度,此时也只有两部分(缺少第三部分),直接第一部分连接第二部分即可
            preNode1.next = reverseNode;
            return node1;
        } else {
            //这里有三部分
            preNode1.next = reverseNode;
            temp1.next = node3;
            return node1;
        }
    }

    public static ListNode reverseList(ListNode head) {
        if (head != null && head.next != null && head.next.next != null) {
            ListNode preNode = head;
            ListNode current = head.next;
            ListNode nextNode;
            //最开始的头节点指向空
            preNode.next = null;
            while (current != null) {
                //先获取下一个节点
                nextNode = current.next;
                //当前节点指向上一个节点
                current.next = preNode;
                //上一个节点赋值为当前节点
                preNode = current;
                //当前节点往后走一步
                current = nextNode;
            }
            return preNode;
        } else if (head != null && head.next != null && head.next.next == null) {
            ListNode nextNode = head.next;
            head.next = null;
            nextNode.next = head;
            return nextNode;
        } else {
            return head;
        }
    }
}