[前端]_一起刷leetcode 面试题 02.02. 返回倒数第 k 个节点

385 阅读1分钟

「这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战

题目:

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

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

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

示例:

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

说明:

给定的 k 保证是有效的。

思路:

  1. 执行一遍while循环,求出链表的长度n
  2. 对节点进行n - k次循环,求出倒数第k位的元素

实现:

var kthToLast = function (head, k) {
  let count = 1;
  let cur = head;

  // 先求长度
  while (cur.next) {
    cur = cur.next;
    count++;
  }

  // 找到倒数K位在正着数时候的位置
  let index = count - k;
  while (index) {
    head = head.next;
    index--;
  }

  //返回节点
  return head.val;
};

优化:

由于题目已经保证K是有效的,所以我们可以利用双指针的思想, 让快指针先走K步,当快指针走到终点时,慢指针所在的位置就是我们求解的值

优化代码

var kthToLast2 = function (head, k) {
  let cur = head;
  while (cur) {

    // 先让快指针走K步,然后再一起走
    cur = cur.next;
    if (k) {
      k--;
    } else {
      head = head.next;
    }
  }

  return head.val;
};

看懂了的小伙伴可以点个关注、咱们下道题目见。如无意外以后文章都会以这种形式,有好的建议欢迎评论区留言。