实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值。
注意:本题相对原题稍作改动
示例:
输入: 1->2->3->4->5 和 k = 2
输出: 4
说明:
给定的 k 保证是有效的。
我的算法实现的为:
/**
* 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 n = k;//这里可以直接使用k
let val;
const _kthToLast = (node) => {
if (node === null) {
return;
}
_kthToLast(node.next)
if (n === 1) {// 第一次进来到头了,就开始判断是否已经到所要求的位置了
val = node.val;// 如果是的话直接保存起来
}
n --;
}
_kthToLast(head);
return val;
};
我就是使用递归的方式实现的。下面我分析一下时间复杂度和空间复杂度。
时间复杂度: 链表的节点数是不明确的;每次循环一定会到底,也就是说至少循环 n 次, 如果传入 k 是最后一位,那么只需要执行 n 次,如果传入的 k 是第一个,那么就需要执行 2n 次,我这样分析是不对,因为在递归中是一定要回来的,也就是先到达链表的底部再返回顶部是一定要经历的,也就是执行的次数一定是 2n 次,那么时间复杂度就为: O(n) 。
空间复杂度:空间复杂度由于使用的是递归,每次执行函数都会增加内存,这里的递归深度为 n ,递归函数没有使用其他的内存开销,所以空间复杂度为: O(n)。
除了我写的方法以外,还有双指针,双指针就可以做到一定是 n 次就找到,只是在维护的时候要维护两个指针。
我的分析不一定正确,如果不正确望指出,因为目前我也是在学习阶段。
来源:力扣(LeetCode)