剑指offer·-链表中倒数第k个结点
2018-03-22 17:52
288 查看
题目描述
输入一个链表,输出该链表中倒数第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; }
相关文章推荐
- 《剑指Offer》学习笔记--面试题15:链表中倒数第k个结点
- 《剑指offer》(面试题15):链表中倒数第k个结点
- 剑指offer:链表中倒数第k个结点
- 剑指Offer(Java版):链表中倒数第K个结点
- 剑指Offer——(14)链表中倒数第k个结点
- 《剑指offer》——链表中倒数第k个结点
- 剑指Offer系列-面试题15:链表中倒数第K个结点
- 链表中倒数第k个结点(剑指offer)
- 剑指offer——14.链表中倒数第k个结点
- 剑指offer(14)—链表中倒数第k个结点
- 剑指offer 15 链表中倒数第k个结点
- 剑指Offer_面试题15_链表中倒数第k个结点
- 剑指offer——链表中倒数第k个结点
- 《剑指offer》链表中倒数第k个结点
- 剑指Offer—编程题15(链表中倒数第k个结点)
- 剑指offer——链表中倒数第k个结点
- 剑指offer(11)-链表中倒数第k个结点
- 《剑指offer》——寻找链表中倒数第k个结点
- 剑指offer练习一 输入一个链表,输出该链表中倒数第k个结点。
- 剑指Offer(14)______链表中倒数第k个结点