穿针引线法虽然代码多,但是容易想到。
public ListNode reverseBetween(ListNode head, int left, int right) {
if(head==null||left==right)
return head;
ListNode dummy=new ListNode();
dummy.next=head;
int i=0;
ListNode node=dummy;
ListNode node_left_pre=null;//代表开始翻转节点的前一个节点
ListNode node_right=head;//代表开始翻转节点的最后一个节点
while(i<=right){
if(i+1==left)
node_left_pre=node;
if(i==right)
node_right=node;
i++;
node=node.next;
}//找到需要翻转的范围所代表的节点
node=node_left_pre.next;
node_left_pre.next=null;
ListNode end=node_right.next;
while(node!=end){
ListNode temp=node.next;
node.next=node_left_pre.next;
node_left_pre.next=node;
node=temp;
}//对指定范围进行翻转
ListNode rear=node;
node=head;
while(node.next!=null){
node=node.next;
}//找到翻转后的最后一个节点
node.next=rear;//和之前断开的节点相连接
return dummy.next;
}