线性表(链表-单链表反转)
需求
原链表数据:1->2->3->4
反转后链表数据:4->3->2->1
图示
1、调用reverse(Node curr)方法反转每一个结点,从元素1结点开始
2、如果发现curr还有下一个结点,则递归调用reverse(curr,next)对下一个节点反转
3、最终递归的出口是元素4结点,因为它没有下一个元素了,
4、让head指向元素4结点,可以发现这里递归调用了4次
5、递归开始返回
递归过程图示如下
其实就是将头结点指向了当前最后一个结点,原本的第一个节点成为了最后一个结点
实现
在单链表中添加两个方法,如下:
//链表反转
//反转整个链表
public void reverse(){
//判断链表是否为空,为空,结束运行;非空,调用重载方法反转
if(isEmpty()){
return ;
}
reverse(head.next);
}
//------------------------------------------------------------
//反转指定结点curr,并把反转后的结点返回
public Node reverse(Node curr){
//如果到了最后一个结点,返回当前结点
if(curr.next == null){
head.next = curr;
return curr;
}
//如果不是最后一个结点
//递归返回当前节点的下一个结点,返回值是链表反转后当前节点的上一个结点
Node pre = reverse(curr.next);
//让返回的结点的下一个结点称为当前结点curr
pre.next = curr;
//把当前结点的下一个结点变为null
curr.next = null;
return curr;
}