递归实现单链表的反转
链表反转
之前用迭代实现了链表反转,受同学启发,也可以用递归方式实现,如下。
对于链表结构,还是采用单链表的反转里面的结构。
注意:
由于递归的操作是规模缩小,操作重复的,所以递归时直接从第一个数据结点开始(不是从空的头结点开始),虽然可以每次回溯时都让。
代码如下:
public void reverse2(Node datahead){
//递归一直到最后一个结点,此时将head头结点指向末尾,末尾数据结点变成新的头数据结点
if(datahead.next==null){
root.next=datahead;
return ;
}
//保存该结点的下一个结点
Node secondnext=datahead.next;
reverse2(secondnext);
//改变相邻结点的方向
secondnext.next=datahead;
//新的数据结点置为空,不然遍历死循环。
datahead.next=null;
}
示例图:
1.一直递归压栈,直到回归条件
2.开始执行递归后面的语句,进行弹栈回溯
一直到最后数据结点方向完全改变: