思路

- 使用虚拟头节点来统一第一个元素的操作
- pre指针向后走m-1步到达需要反转的第一个节点的pre节点
- cur就是此时需要反转的
- tmp记录cur此时的next元素
- 首先让cur的next指针指向tmp.next
- 然后让tmp指向cur的前面
- 再将pre.next指向tmp
迭代
public ListNode reverseBetween(ListNode head, int m, int n) { //建立一个虚拟头结点 ListNode dummyHead = new ListNode(-1); //虚拟头结点的next指向head dummyHead.next = head; //pre的next指向head ListNode pre = dummyHead; //pre向后移动m-1步 for(int i=0;i<m-1;i++) pre=pre.next; //记录当前要修改的值 ListNode cur = pre.next; for(int i=m;i<n;i++){ //记录临时指针 ListNode tmp = cur.next; cur.next = tmp.next; tmp.next = pre.next; pre.next = tmp; } return dummyHead.next; }