递归求单链表中倒数第k个结点

递归求单链表中倒数第k个结点

这次算法课留的作业之一,递归求单链表中倒数第k个结点

又是有关单链表的,正好用上上次做逆置的类了(逆置)

说下我最初的想法吧。自己还是单纯,脑子磨不过这个弯来。在这里插入图片描述

  1. 先用一个指针flag遍历整个单链表得到长度length
  2. length-k,得到第二个指针index移动到目标结点(倒数第k个)的次数
  3. 设置一个计数器countindex每移动一次,count便+1
  4. 直到count==length-k,便返回index所指。

在这里插入图片描述

缺点:效率太低,同样操作要执行两次for,可以进行优化。

第二种方法是把两个指针变成一个类似于滑块一样的结构,flag先出发,index后出发,步距为n-1。两个指针保持一定的距离,并同时运动。等到flag到达最后一个时候,index所指结点就是倒数第n个结点。

(很容易理解,如果index和flag同时开始运动,步距为0,flag到底时index所指即为倒数第1个;flag先后移一个结点,步距相差1,flag到底时index所指为倒数第2个结点,以此类推…)
在这里插入图片描述

	/*
     * @Title getReciprocal
     * @Description 求倒数第n个,递归中n表示index移动到目标结点的次数为length-n
     *               flag先移动,每次都--n,直到n=1,flag与index一同移动,flag到尾巴时index即为所求
     * @author 滑技工厂
     * @Date 2020/3/6
     * @param [flag, index, n]
     * @return cn.huaji.main.Node
     * @throws
     */
    public static Node getReciprocal(Node flag, Node index, int n) {
        //第一个指针到尾巴,就返回指针2
        if (flag.next == null) {
            return index;
        }
        if (n <= 1) {
            //n=1时index开始移动
            index = index.next;
        }
        flag = flag.next;

        return getReciprocal(flag, index, --n);

    }

这篇看题到完成也写了一天了,如果你觉得对你有帮助就点个小赞👍吧。

你的鼓励是对我的最大支持!

最后吉祥物镇楼
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值