【路飞】链表-返回倒数第k个节点

142 阅读1分钟

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

题目:链表中倒数第k个节点

解法一

分析:采用双指针方式,让一个指针先走 k 步,然后两个指针一起走,当 p2 指向最后一个节点时,p1 指向倒数第 k 个节点

function getKthFromEnd(head, k) {
  if (!head) return null;
  let p1 = head;
  let p2 = head;
  for (let i = 0; i < k; i++) {
    p2 = p2.next;
  }
  while (p2) {
    p1 = p1.next;
    p2 = p2.next;
  }
  return p1;
}

解法二

分析:先计算出总数,然后算出是正数第几个的方式

var getKthFromEnd = function (head, k) {
  let cur = head;
  let sum = 0;
  while (cur) {
    cur = cur.next;
    sum++;
  }
  cur = head;
  let val = sum - k;
  while (val > 0 && cur) {
    cur = cur.next;
    val--;
  }
  return cur;
};

解法三

递归:

var getKthFromEnd = function(head, k) {
  let result = null;
  function helper(head, k) {
    if (!head) return 0;
    const total = helper(head.next, k) + 1;
    if (total === k) {
      result = head;
    }
    return total;
  }
  helper(head, k);
  return result;
};

写在最后

本来的解答都经过了力扣的校验,文章写的有些匆忙,实现方式上有啥不足的欢迎指正,如果还有其它好的实现方式也欢迎在留言区讨论。