题目
- 输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。
- leetcode链接:https://leetcode-cn.com/problems/lian-biao-zhong-dao-shu-di-kge-jie-dian-lcof/
思路
- 队列
- 快慢指针,快指针先走k-1步,之后快慢指针同步走,走到快指针走到最后一个结点的时候,慢指针也走到了倒数第k个结点
- 递归查找
/**
* @param {ListNode} head
* @param {number} k
* @return {ListNode}
* 队列
*/
var getKthFromEnd = function (head, k) {
const queue = []
let node = head
while (node) {
queue.unshift(node)
node = node.next
}
if (k > queue.length) return null
return queue[k - 1]
}
/**
* @param {ListNode} head
* @param {number} k
* @return {ListNode}
* 快慢指针
*/
var getKthFromEnd = function(head, k) {
let fast = head
let slow = head
while (k) {
fast = fast.next
k--
}
while (fast) {
fast = fast.next
slow = slow.next
}
return slow
};
/**
* @param {ListNode} head
* @param {number} k
* @return {ListNode}
* 递归查找
*/
/**
* @param {ListNode} head
* @param {number} k
* @return {ListNode}
*/
var getKthFromEnd = function(head, k) {
let counts = 0
function traverse(node) {
if (!node) return null
const result = traverse(node.next)
if (result) return result
counts++
if (counts === k) return node
}
return traverse(head)
};