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) { // 1. 处理特殊情况:只有一个节点或者为空或者m=n if (head == null || head.next == null || m == n) return head; Stack<ListNode> s1 = new Stack<>(); Stack<ListNode> s2 = new Stack<>(); // 2. 将前m-1个存入栈s1中 int M = m; ListNode cur = head; while (M-- != 1) { s1.push(cur); cur = cur.next; } // 3. 将m到n的节点存入栈s2 int count = n - m + 1; while (count-- != 0) { s2.push(cur); cur = cur.next; } // 4. 将中间需要反转的部分使用栈反转 ListNode newHead = new ListNode(-1); ListNode tmp1 = newHead; ListNode top = null; while (!s2.empty()) { top = s2.pop(); tmp1.next = top; tmp1 = tmp1.next; } // 此处反转完成 tmp1.next = cur; // 5. 处理前m-1个节点(将栈s1中的元素存入栈s2,然后再从s2依次取出保证了原有顺序) while (!s1.empty()) { s2.push(s1.pop()); } ListNode newHead2 = new ListNode(-1); tmp1 = newHead2; while(!s2.empty()) { top = s2.pop(); tmp1.next = top; tmp1 = tmp1.next; } // 6. 返回整理后的 tmp1.next = newHead.next; return newHead2.next; } }