思路就是使用头插法对链表m到n部分进行反转吧,需要先找到m的前一个节点,以及m节点所在的位置。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode reverseBetween(ListNode head, int m, int n) {
if(head == null){
return null;
}
// 双指针指向两个位置:m的前一个节点,m位置所在的节点
// 设置哨兵节点
ListNode newHead = new ListNode(0);
newHead.next = head;
//遍历找到两个节点的位置
int index = 0;
ListNode p = newHead;
ListNode q = newHead.next;
while(index!=m-1){
p = p.next;
q = q.next;
index++;
}
// 对m到n位置使用头插法反转链表
for(int i=0;i<(n-m);i++){
// p节点 -> q节点 -> 准备头插节点1(cur) -> 准备头插节点2 -> ... -> 准备头插节点(m-n+1)-> n节点之后的节点
// 存储要头插的节点
ListNode cur = q.next;
//将q指向要头插节点后面的节点,不要断链
q.next = q.next.next;
cur.next = p.next;
p.next = cur;
}
return newHead.next;
}
}