题解 | 链表内指定区间反转 特殊情况很多,边界值麻烦,虚拟头节点,过程繁琐。
链表内指定区间反转
https://www.nowcoder.com/practice/b58434e200a648c589ca2063f1faf58c
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 //特殊情况 if (m == n) return head; //虚拟头节点,用来应对边界情况 ListNode myNode = new ListNode(-1); myNode.next = head; ListNode left = null; ListNode right = null; ListNode left_last = null; //寻找区间链表 int i = 0; ListNode temp = myNode; while (temp != null) { if (i == m-1) { left_last = temp; } if (i == n) { right = temp; break; } temp = temp.next; i++; } //备份头尾节点 ListNode right_next = right.next; left = left_last.next; //切断联系 right.next=null; left_last.next=null; //反转链表 ListNode last = null; ListNode cur = left; while (cur!=null) { temp = cur.next; cur.next = last; last = cur; cur = temp; } //接回链表: left.next = right_next; left_last.next = right; return myNode.next; } }