力扣刷题(单链表)
题目描述:
实现一种算法,找出单向链表中倒数第 k 个节点,返回该节点的值。
示例:
输入: 1->2->3->4->5 和 k = 2 输出: 4
说明:
给定的 k 保证是有效的。
思路分析:
(1)对于这道题而言,有一种特别简单的做法就是将链表遍历两遍,一遍得到这个链表的总长度,一遍再来寻找这个要求的节点;
(2)但是第一种情况所耗费的时间太多,所以能否有一种方法能够让我们只遍历一遍就得到结果呢?
那就是在这遍历的一遍中设置两个指针,向后进行遍历,相当于遍历两遍。这样我们就可以设置两个指针分别为fast和slow,由fast和slow之间的距离为k - 1,当fast到达重点,slow就是所要求得的那个指针。
注意:
这个k的值不满足条件的情况分析(k = 0) 步骤:
- 判断k
- ast先走k - 1步
- 向后,知道fast达到重点,结束。
class Solution {
public int kthToLast(ListNode head, int k) {
//快慢指针
ListNode fast = head;
ListNode slow = head;
int count = 0;
if(k <= 0) {
return -1;
}
while(fast != null && count < k - 1) {
if(fast.next == null) {
return -1;
}
fast = fast.next;
count++;
}
while(fast != null) {
if(fast.next == null) {
break;
}
fast = fast.next;
slow = slow.next;
}
return slow.val;
}
}