给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。
将 low移动到第一个要反转的节点的前面,将 fast移动到第一个要反转的节点的位置上。我们以 m=2,n=4为例。 2、将 fast 后面的元素删除,然后添加到low的后面。也即头插法。 3、根据 m 和 n 重复步骤(2) 4、返回 head
class Solution {
public ListNode reverseBetween(ListNode head, int left, int right) {
/**
双指针+头插法
*/
ListNode newNode=new ListNode(-1); //防止fast.next.next空指针
newNode.next=head;
ListNode low=newNode,fast=newNode.next;
//移动到相应位置, low=移动的前面的那个 fast=移动的那个
for(int i=0;i<left-1;i++){
low=low.next;
fast=fast.next;
}
//头插法删除fast.next 插入到low.next
for(int i=0;i<right-left;i++){
ListNode temp=fast.next;
fast.next=fast.next.next;
temp.next=low.next;
low.next=temp;
}
return newNode.next;
}
}