算法连载(第三期)

277 阅读1分钟

hello大家好我是Django,今天给大家分享的算法是 《从尾到头打印链表》、《返回倒数第 k 个节点

从尾到头打印链表

要求

输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。

示例 1:

输入:head = [1,3,2]
输出:[2,3,1]

限制:

0 <= 链表长度 <= 10000

思路

  • 从尾部到头部的的遍历我们可以采用,深度优先的便利方式
  • 使用递归的形式进行深度便利

image.png

实现

/**
 * @param {ListNode} head
 * @return {number[]}
 */
var reversePrint = function(head) {
    const arr = [];

    function pushVal(node) {
        if(!node) return;
        pushVal(node.next)
        arr.push(node.val)
    }

    pushVal(head);

    return arr
};

返回倒数第 k 个节点

要求

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

示例:

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

说明: 给定的 k 保证是有效的。

思路

循环链表,从最后一个开始计数。当找到倒数第k个时记录该值

image.png

实现

/**
 * @param {ListNode} head
 * @param {number} k
 * @return {number}
 */
var kthToLast = function(head, k) {
    let findVal;
    function findLastKVal(node) {
        if(!node) return 0;
        const count = findLastKVal(node.next) + 1;
        if(count === k) {
            findVal = node.val
        }
        return count;
    }

    findLastKVal(head)
    return findVal
};