数据结构与算法 17 链表 → 链表的反转

4.4 链表 → 链表的反转


链表反转肯定是 单链表呀!因为 双链表 和 循环链表 完全不需要反转。。

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

  • 需求:
    原链表中数据为∶1->2->3->4
    反转后链表中数据为∶4->3->2->1

  • 反转API:
    public void reverse():对整个链表反转
    public Node reverse(Node curr)∶反转链表中的某个结点curr,并把反转后的curr结点返回
    使用递归可以完成反转,递归反转其实就是从原链表的第一个存数据的结点开始,依次递归调用反转每一个结点,直到把最后一个结点反转完毕,整个链表就反转完毕。
    在这里插入图片描述

  1. 调用reverse(Node curr)方法反转每一个结点,从元素1结点开始;
  2. 如果发现curr还有下一个结点,则递归调用reverse(curr.next)对下一个结点反转;
  3. 最终递归的出口是元素4结点,因为它没有下一个元素了,当到了出口处,让head指向元素 4 结点,共递归调用4次。
  4. 递归开始返回;
 //null 1 2
    public Node reverse(Node curr)
    {
        if(curr.next == null)
        {
            head.next = curr;
            return curr;
        }
        return reverse(curr.next).next = curr;
    }

    public void reverse()
    {
        reverse(head.next).next = null;
    }

这个 递归 其实 还算不难,算是 入门级的。主要是 有一个 条件 你是不可能在 递归的时候 填入的。那就是 最后一步,你必须让 最后一个结点 的 next 值 = null !!!(哈哈~ 是不是 挺懵的。当初我在写的时候 也是很懵。一直都 输出循环的值,甚至输出不出来,后来才发觉 忽略了 尾结点 为 null)

在递归的时候,一定要注意 头结点.next

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值