找出倒数第k个节点

120 阅读1分钟

力扣刷题(单链表)

题目描述:

实现一种算法,找出单向链表中倒数第 k 个节点,返回该节点的值。

示例:

输入: 1->2->3->4->5 和 k = 2 输出: 4

说明:

给定的 k 保证是有效的。



思路分析:

(1)对于这道题而言,有一种特别简单的做法就是将链表遍历两遍,一遍得到这个链表的总长度,一遍再来寻找这个要求的节点;
(2)但是第一种情况所耗费的时间太多,所以能否有一种方法能够让我们只遍历一遍就得到结果呢? 那就是在这遍历的一遍中设置两个指针,向后进行遍历,相当于遍历两遍。这样我们就可以设置两个指针分别为fast和slow,由fast和slow之间的距离为k - 1,当fast到达重点,slow就是所要求得的那个指针。

注意:

这个k的值不满足条件的情况分析(k = 0) 步骤:

  1. 判断k
  2. ast先走k - 1步
  3. 向后,知道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;
    }
}