题目描述
- 输入一个链表,输出该链表中倒数第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
经验教训
代码实现
public ListNode FindKthToTail(ListNode head,int k) {
if (head == null || k == 0) {
return null;
}
int size = 0;
ListNode index = head;
while (index != null) {
size++;
index = index.next;
}
if (k > size) {
return null;
}
int i = 1;
ListNode resNode = head;
for (; head != null && i <= size - k ; i++) {
resNode = resNode.next;
}
return resNode;
}
public ListNode FindKthToTail(ListNode head,int k) {
ListNode fast = head;
ListNode slow = head;
int i = 1;
while (i <= k && fast != null) {
fast = fast.next;
i++;
}
while (fast != null) {
fast = fast.next;
slow = slow.next;
}
return i == k+1 ? slow : null;
}