剑指offer·-链表中倒数第k个结点

题目描述

  • 输入一个链表,输出该链表中倒数第k个结点。
  • 地址:牛客链接

解题方法

  • 方法一:因为是单链表,如果链表长度为 size ,如果要找链表中倒数第k个结点,相当于找链表中第 size - k + 1 个结点
    • 首先遍历链表,得到链表长度 size
    • 然后看 k 是否大于 size,若是则直接返回 null
    • 从头开始,找到第第 size - k + 1 个结点,返回
  • 方法二:利用快慢指针,起初快慢指针都指向链表头部 head,先让 快指针 走 k 步,指向 第 k+1 个指针,然后快慢指针一起走,直至快指针指向null,停止,此时慢指针指向倒数第 k 个节点。
    • 那么如何处理 k 大于链表长度的情况呢
      如果 k 大于链表长度,那么第一次快指针走的时候就会出现 空指针异常,所以必须在循环条件中加一个 判null 操作。 如果正常走完 k步,i 的值应该为 k+1 ,所以我们只需判断 i是否等于 k+1 便可知道是否大于链表长度,若大于,则返回null

经验教训

  • 链表的空指针异常问题!!!
  • 快慢指针这个奇淫技巧

代码实现

  • 方法1:
    public ListNode FindKthToTail(ListNode head,int k) {
        //链表为空或者k为0
        if (head == null || k == 0) {
            return null;
        }
        //计算链表长度
        int size = 0;
       ListNode index = head;
        while (index != null) {
            size++;
            index = index.next;
        }
        //如果 k > 链表长度size
         if (k > size) {
            return null;
        }
        //查找链表中第 size - k + 1 个节点
         int i = 1;
         ListNode resNode = head;
        for (; head != null && i <= size - k ; i++) {
            resNode = resNode.next;
        }
        return resNode;
    }
  • 方法2:
    public ListNode FindKthToTail(ListNode head,int k) {
        ListNode fast = head;
        ListNode slow = head;
        int i = 1;
        //快指针先走k步
        while (i <= k && fast != null) {
           fast = fast.next;
           i++;
        }
        //快慢指针一起走,慢指针最终指向倒数第k个(假如k小于等于链表长度)
        while (fast != null) {
            fast = fast.next;
            slow = slow.next;
        }
        //检测是否k大于链表长度,若是返回null
        return i == k+1 ? slow : null;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值