解题思路
迭代
- 使用虚拟头节点来统一第一个元素的操作
- 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;
}