import java.util.*; public class Solution { public ListNode reverseBetween (ListNode head, int m, int n) { ListNode dummyNode = new ListNode(-1); dummyNode.next = head; ListNode pre = dummyNode; //1.走m-1步到left的前一个节点 for(int i=0;i<m-1;i++){ pre = pre.next; } //2.走n-m+1步到right节点 ListNode rigthNode = pre;//当n=m=1时防止走出界 for(int i=0;i<n-m+1;i++){ rigthNode = rigthNode.next; } //3.截取出一个子链表 ListNode leftNode = pre.next; ListNode cur = rigthNode.next; //4.切断链接 pre.next=null; rigthNode.next=null; //5.反转局部链表 reverse(leftNode); //6.接回原来的链表 pre.next = rigthNode; leftNode.next = cur; return dummyNode.next; } private void reverse(ListNode s){ //头插法反转链表 ListNode cur = s; ListNode Cur_next = cur; while(cur!=null){ //Cur_next 指向cur节点的下一个节点 Cur_next = cur.next; cur.next = s; s = cur; cur = Cur_next ; } } }