您的位置:首页 > Web前端

剑指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 链表