数据结构之单链表的反转


链表反转

单链表的反转,是面试中一个高频题目

原理分析

使用递归完成反转,递归反转其实就是从原链表的第一个存数据的结点开始,一次递归调用反转每一个结点,知道把最后一个结点反转完毕,整个链表就反转完毕。

1.调用reverse(Node curr)方法反转每一个结点,从元素1结点开始

2.如果发现curr还有下一个节点,则递归调用reverse(curr.next)对下一个节点进行反转

3.最终递归的出口是,next为null,让head节点指向最后一个元素节点

4.递归开始返回

代码实现

//用来反转整个链表
public void reverse(){

    //判断当前链表是否为空链表,如果是空链表,则结束运行,如果不是,则调用重载的reverse方法完成反转
    if (isEmpty()){
        return;
    }

    reverse(head.next);
}

//反转指定的结点curr,并把反转后的结点返回
public Node reverse(Node curr){
    if (curr.next==null){
        head.next=curr;
        return curr;
    }
    //递归的反转当前结点curr的下一个结点;返回值就是链表反转后,当前结点的上一个结点
    Node pre = reverse(curr.next);
    //让返回的结点的下一个结点变为当前结点curr;
    pre.next=curr;
    //把当前结点的下一个结点变为null
    curr.next=null;
    return curr;
}

测试

public class TestLinkList {
    public static void main(String[] args) {
        LinkList<String> list = new LinkList<String>();
        list.insert("姚明");
        list.insert("科比");
        list.insert("库里");
        list.insert("乔丹");

        list.reverse();
    
        for (Object o : list) {
            System.out.println(o);
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值