反转链表II解题思路
首先可以抽取一个反转前n个节点的方法出来,设置三个指针,前指针pre,当前指针cur,下一个指针next,反转时,cur指向pre,然后pre,cur,next依次往后走一步,代码如下:
public ListNode reverse(ListNode head, int n) {
ListNode pre=null,cur=head,next=null;
while(n>0){
next=cur.next;
cur.next=pre;
pre=cur;
cur=next;
n--;
}
head.next=cur;
return pre;
}
注意倒数第二行:以上图例子为例,head就是在2的位置,反转完2-4后2需要指向5,而循环跳出后cur刚好在5这个节点的位置,因此需要将2节点指向5节点。
有了这个方法后就可以很方便的进行反转了:
首先right-left+1得到需要反转的节点数,然后需要定义一个虚拟头节点,因为head可能会发生变化,这个情况下定义一个虚拟头节点比较好,然后就可以定义一个指针,指针一直找到left的前一个位置,最后就可以指向用reverse返回回来的节点了。
public ListNode reverseBetween(ListNode head, int left, int right) {
ListNode hair=new ListNode(0,head),con=hair;
int n=right-left+1;
while(left>1){
con=con.next;
left--;
}
con.next=reverse(con.next,n);
return hair.next;
}