92. 反转链表 II
难度:中等
类似题目:反转链表1
题目描述
解题思路
先设置虚拟头节点便于处理m=1的情况,然后找到第m个节点的前一位,反转m~n之间,注意最后还要把反转之后节点指向剩余的节点
/*
* 92. 反转链表 II
* 2020/5/15
*/
public ListNode reverseBetween(ListNode head, int m, int n) {
if(m == n)
return head;
ListNode p = new ListNode(0); //设置一个虚拟头节点
p.next = head;
head = p;
n = n-m+1;
while(m-- > 1) {
p = p.next;
}
ListNode q = null;
ListNode cur = p.next;
ListNode next = null;
while(n-- > 0 && cur != null) { //反转开始
next = cur.next;
cur.next = q;
q = cur;
cur = next;
}
p.next = q; //p指向反转之后和链表的头
while(q.next != null) {
q = q.next;
}
q.next = next; //q指向反转之后剩余的链表部分
return head.next;
}