[路飞] leetcode. 面试题 02.02. 返回倒数第 k 个节点

133 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、题目描述

面试题 02.02. 返回倒数第 k 个节点

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

注意: 本题相对原题稍作改动

示例

示例1:

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

说明:

给定的 k 保证是有效的。

二、思路分析

翻转链表

将链表翻转以后,返回翻转后的第k个节点即可;

快慢指针

定义一个快指针fast 和慢指针slow,初始他们都指向头head;
快指针先走k步, 然后让快慢指针一起向后走,直到fast走过为节点(为null),这是slow指向节点就是倒数第k个节点

三、JavaScript代码

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} head
 * @param {number} k
 * @return {number}
 */
var kthToLast = function(head, k) {
    // 翻转链表
    // let cur = head, pre = null,count = 1;
    // while(cur) {
    //     let next = cur.next;
    //     cur.next = pre;
    //     pre = cur;
    //     cur = next;
    // }
    // while(pre) {
    //     if(count == k) {
    //         return pre.val
    //     }
    //     pre = pre.next
    //     count ++
    // }

    //快慢指针
    let [fast ,slow] = [head, head];
    // 快指针先走k步
    while(k --) {
        fast = fast.next
    }
    while(fast) {
        fast = fast.next;
        slow = slow.next;
    }
    return slow.val
};

四、总结