Leetcode前端必会系列:链表倒数第K个节点

97 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第14天,点击查看活动详情

引言

算法的技能对于程序员是百益而无一害,作为程序员无论是前端还是后端算法技能对于我们都是十分十分的重要,我将陆续整理并讲解前端程序员必须掌握的经典算法。

题目描述

输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。

例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。

 

示例:

给定一个链表: 1->2->3->4->5, 和 k = 2.

返回链表 4->5.

 

提示:

  • m == matrix.length
  • n == matrix[i].length
  • 1 <= m, n <= 10
  • -100 <= matrix[i][j] <= 100

分析

根据题目的分析,我们如何设计链表倒数第k个节点?根据规律发现,我们可以先让链表先向前走k步骤,然后判断最后位置

  1. 使用指针p初始指向头节点位置上
  2. p指针向前移动k步骤
  3. 使用指针q指向头节点,然后p和q同步的向前走
  4. 当指针p指向了空,此时q指针就是倒数第k个节点了。
  5. 返回结果

解答

/** * Definition for singly-linked list. * function ListNode(val) { * this.val = val; * this.next = null; * } */ /** * @param {ListNode} head * @param {number} k * @return {ListNode} */ var getKthFromEnd = function(head, k) { let p = head let i = 0 while(p && i<k) { p = p.next i++ } let q = head while(p) { p = p.next q = q.next } return q };

通过题目的分析,我们按照题目的需求成功的设计了求倒数第k个链表节点的例子,整体的时间复杂度是o(n).空间复杂度是o(1)

总结

链表倒数第K个节点需要我们仔细分析问题,通过对问题的拆解可以快速的完成对问题的求解。我们必须牢固的掌握其在具体应用和实践的应用。