输出单链表中倒数第K个节点

最优解:快慢指针

    public ListNode finfKthToTail(int k){
        if(k<=0||k>size()){
            return null;
        }
        ListNode fast=head;
        ListNode slow=head;//让快慢指针在起始位置
        //先让fast走k-1步
        for(int i=0;i<k-1;i++){
            fast=fast.next;
        }
        //fast和slow同时走到fast.next=null
        while (fast.next!=null){
            slow=slow.next;
            fast=fast.next;
        }
        return slow;
    }

这个函数的算法思想是基于快慢指针(也称为“龟兔赛跑”算法)来找到链表中倒数第 k 个节点的。具体算法思想如下: 

  1. 参数检查:首先,函数检查传入的 k 值是否有效。如果 k 小于等于0或者大于链表的长度(这里假设 size() 函数能够返回链表的长度),则直接返回 null,因为这两种情况下都无法找到有效的倒数第 k 个节点。
  2. 初始化指针:然后,函数初始化两个指针 fast 和 slow,都指向链表的头节点 head。这两个指针将用于在链表上移动,以找到倒数第 k 个节点。
  3. 快指针先行:接下来,函数通过一个循环让快指针 fast 先行移动 k-1 步。这个步骤的目的是让快指针和慢指针之间拉开 k-1 个节点的距离。这样,当快指针到达链表末尾(即 fast.next == null)时,慢指针 slow 将位于链表的倒数第 k 个节点上。
  4. 快慢指针同步移动:在快指针先行 k-1 步之后,函数进入一个 while 循环,让快指针 fast 和慢指针 slow 同时向前移动,直到快指针到达链表的末尾(即 fast.next == null)。在这个过程中,由于快指针比慢指针多走了 k-1 步,因此当快指针到达末尾时,慢指针正好位于倒数第 k 个节点上。
  5. 返回结果:最后,函数返回慢指针 slow 所指向的节点,即链表的倒数第 k 个节点。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值