用递归反转单链表
首先考虑递归的边界条件,什么情况下不用反转
当只有一个结点的时候
从前往后走,到只剩最后一个结点时返回该结点,作为新链表的头结点
所以代码应该是是这样的
public static void reverse(Node head){
if(head.next==null) return head;
Node reversed=reverse(head.next);
......
}
那么接下来就应该找递推公式了
递推公式怎么求呢
比方说 h1.next=h2 h2.next=null;
也就是说h1指向h2,而h2指向null,那么我们怎么反转它呢
应该是 h2.next=h1 h1.next=null
而h2=h1.next 就可以写成 h1.next.next=h1;h1.next=null;
那么我们的递推公式就求出来了
代码就应该是
public static void reverse(Node head){
if(head.next==null) return head;
Node reversed=reverse(head.next);
head.next.next = head;
head.next = null;
return reversed;
}
刚开始一直有疑问,就是当第一次从递归出来时,head不是应该指向最后一个结点吗,那递推公式怎么求,在这块想半天,然后又自己debug,才终于明白。
首先边界条件就是return最后一个结点,那么head等于什么时return的最后一个结点呢?
假如现在就是那个第一次返回的head1,在这个head1上调用reverse(head1.next),然后head1.next被当作参数传进去了。
为了方便理解我们让head2=head1.next
首先判断head2.next==null,发现正确return head2;,这时head1.next.next=head1; head1.next=null;
也可以理解为head2.next=head1,head1.next=null;
然后就都一样了